我正在尝试在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"
}
有人可以帮忙吗?
答案 0 :(得分:4)
This answer为我提供了与npm相关的不同任务。建议使用可执行文件和args而不是commandLine。
executable 'npm'
args ['install']
根据您的目录结构,您可能还需要添加workingDir属性并将其设置为package.json所在的目录。
作为替代方案,Gradle Node Plugin对于管理Gradle构建中最常见的Node任务也非常方便。我使用此插件作为我的Node任务的基础,然后根据需要创建其他自定义任务。
答案 1 :(得分:2)
如果您使用的是Windows,请尝试以下操作:
task npmInstall(type: Exec) {
commandLine "npm.cmd", "install"
}
代替此:
task npmInstall(type: Exec) {
commandLine "npm", "install"
}
答案 2 :(得分:1)
如果使用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'
}
答案 3 :(得分:0)
我使用了@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将分别位于数组的第二和第三位置。