Gradle 无法执行 npm 命令

问题描述 投票:0回答:6

我正在尝试在 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"
}

有人可以帮忙吗?

java intellij-idea gradle npm npm-install
6个回答
12
投票

如果您使用的是 Windows,请尝试以下操作:

task npmInstall(type: Exec) {
    commandLine "npm.cmd", "install"
}

而不是这个:

task npmInstall(type: Exec) {
    commandLine "npm", "install"
}

7
投票

如果您使用的是 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'
}

6
投票

这个答案对我来说适用于不同的 npm 相关任务。建议使用可执行文件和参数而不是命令行。

executable 'npm'
args ['install']

根据您的目录结构,您可能还需要添加workingDir属性并将其设置为package.json所在的目录。

作为替代方案,Gradle Node Plugin 对于管理 Gradle 构建中最常见的 Node 任务也非常方便。我使用这个插件作为我的 Node 任务的基础,然后根据需要创建其他自定义任务。


2
投票

如果您使用 IntelliJ 并且 npm 是使用 nvm 安装的,请检查 此问答


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 将分别位于数组的第二个和第三个位置。


0
投票

要拥有它独立于平台并且尽可能简单我会像下面这样:

task npmInstall(type: Exec) {
    commandLine Os.isFamily(Os.FAMILY_WINDOWS) ? 'npm.cmd' : 'npm', "install"
}
© www.soinside.com 2019 - 2024. All rights reserved.