【问题标题】:Gradle couldn't execute npm commandGradle 无法执行 npm 命令
【发布时间】:2016-06-03 01:57:30
【问题描述】:

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

有人可以帮忙吗?

【问题讨论】:

  • 这个目录存在吗? /Users/psilva/Documents/projects/registrolivre

标签: java intellij-idea gradle npm npm-install


【解决方案1】:

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

The problem is

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

确实,它可以从带有./idea.sh 的 bash 终端启动 IJ

在我的例子中,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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您使用的是 Windows 操作系统,则必须使用“npm.cmd”而不是“npm”。更好地检测操作系统是否是 Windows 并构建您的 npm 命令。请看下面的代码sn-p,

      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'
      }
      

      【讨论】:

        【解决方案4】:

        如果你在 Windows 上试试这个:

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

        而不是这个:

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

        【讨论】:

        • 这对我有用。我必须在项目根目录上创建.npmrc 文件,但要忽略strict-ssl
        【解决方案5】:

        This answer 为我工作了一个不同的与 npm 相关的任务。那里的建议是使用可执行文件和参数而不是命令行。

        executable 'npm' args ['install']

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

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

        【讨论】:

        • 我在使用 IntelliJ 和 Gradle 时遇到了同样的问题。这个答案中提到的Gradle Node Plugin 解决了我的集成问题,也清理了一些与 npm 相关的任务。
        • 使用插件也为我解决了这个问题。也许只是将它作为 exec 任务运行不会看到 npm。由于插件为您安装了 npm,因此它可以工作。只是一个猜测。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2019-11-28
        • 2019-10-20
        • 1970-01-01
        • 2017-01-11
        • 1970-01-01
        • 2021-10-19
        • 2017-09-14
        • 2015-01-21
        相关资源
        最近更新 更多