我正在尝试在 gradle 任务中运行 npm 命令,但出现了一个奇怪的错误:
Caused by: net.rubygrapefruit.platform.NativeException: Could not start 'npm'
at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:27)
at net.rubygrapefruit.platform.internal.WrapperProcessLauncher.start(WrapperProcessLauncher.java:36)
at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:65)
... 2 more
Caused by: java.io.IOException: Cannot run program "npm" (in directory "/Users/psilva/Documents/projects/registrolivre"): error=2, No such file or directory
at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25)
... 4 more
Caused by: java.io.IOException: error=2, No such file or directory
这就是我的任务:
task npmInstall(type: Exec) {
commandLine "npm", "install"
}
有人可以帮忙吗?
如果您使用的是 Windows,请尝试以下操作:
task npmInstall(type: Exec) {
commandLine "npm.cmd", "install"
}
而不是这个:
task npmInstall(type: Exec) {
commandLine "npm", "install"
}
如果您使用的是 Windows 操作系统,则必须使用“npm.cmd”而不是“npm”。最好检测操作系统是否是 Windows 并构建您的 npm 命令。请参阅下面的代码片段,
import org.apache.tools.ant.taskdefs.condition.Os
task npmInstall(type: Exec) {
String npm = 'npm';
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
npm = 'npm.cmd'
}
workingDir 'src/main/webapp'
commandLine npm, 'install'
}
这个答案对我来说适用于不同的 npm 相关任务。建议使用可执行文件和参数而不是命令行。
executable 'npm'
args ['install']
根据您的目录结构,您可能还需要添加workingDir属性并将其设置为package.json所在的目录。
作为替代方案,Gradle Node Plugin 对于管理 Gradle 构建中最常见的 Node 任务也非常方便。我使用这个插件作为我的 Node 任务的基础,然后根据需要创建其他自定义任务。
如果您使用 IntelliJ 并且 npm 是使用 nvm 安装的,请检查 此问答
我使用@ALDRIN P VINCENT答案来解决这个问题。但如果您需要将命令行参数传递给 npm 脚本,您可以这样做:
假设以下系统属性传递给 gradle 脚本
gradle test-Dsome1=dev -Dsome2=https://www.google.com
在 build.gradle 的测试脚本中,您将执行以下操作:
task apifunctionaltest(type: Exec) {
String npm = 'npm';
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
npm = 'npm.cmd'
}
commandLine npm, 'run', 'test', '--', '--some1='+System.getProperty("some1"), '--some2='+System.getProperty("some2")
}
主命令以 commandLine npm 开头...这行相当于:
npm run test -- --some1=dev --some2=https://www.google.com
package.json 中的测试脚本还应该有“npm install”(视情况而定)命令,以便在测试运行之前安装节点模块。如果模块已经安装,节点不会浪费时间重新安装它们。测试脚本应该是这样的:
"scripts": {
"test": "npm install && webpack"
}
然后您可以通过
process.argv[2]
和 process.argv[3]
选择这些命令行参数。
如果您有像我这样的简单脚本,那么 some1 和 some2 将分别位于数组的第二个和第三个位置。
要拥有它独立于平台并且尽可能简单我会像下面这样:
task npmInstall(type: Exec) {
commandLine Os.isFamily(Os.FAMILY_WINDOWS) ? 'npm.cmd' : 'npm', "install"
}