16

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

有人可以帮忙吗?

4

5 回答 5

10

如果你在 Windows 上试试这个:

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

而不是这个:

task npmInstall(type: Exec) {
    commandLine "npm", "install"
}
于 2018-09-12T04:26:25.213 回答
6

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

executable 'npm' args ['install']

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

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

于 2016-10-31T15:36:06.597 回答
6

如果您使用的是 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'
}
于 2018-11-22T10:11:50.670 回答
2

在 MX Linux 上,我使用nvm在 linux 中安装了节点,而其他答案均不适合我。

问题是

NVM 仅在终端启动时修补环境变量。如果 IDE 从终端启动,它会继承终端环境...

实际上,它可以从 bash 终端启动 IJ./idea.sh

就我而言,nvm 在我的 ~./bashrc 末尾添加了 pathced 环境变量。以下步骤对我有用;

  1. 将下面的行从 ~/.bashrc 移动到 ~./profile

    导出 NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && 。"$NVM_DIR/nvm.sh" # 这会加载 nvm [ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # 这会加载 nvm bash_completion

  2. $ sudo ln -s "$(which node)" /usr/local/bin/node

  3. 在 IJ 中配置 npm 在此处输入图像描述

  4. 注销和登录(步骤 1 的会话重新启动)

更新:为了从 bash 运行 nvm。以下行必须添加到 .bashrc

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
于 2021-12-12T10:20:33.560 回答
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'(取决于)命令,以便在测试运行之前安装节点模块。如果模块已经安装,node 不会浪费时间重新安装它们。测试脚本应该是这样的:

"scripts": {
    "test": "npm install && webpack"
  }

然后你可以通过process.argv[2]和选择那些命令行参数process.argv[3]

如果您有像我这样的简单脚本,那么 some1 和 some2 将分别位于数组的第二和第三位置。

于 2018-12-18T14:39:08.847 回答