web-dev-qa-db-ja.com

Gradleはnpmコマンドを実行できませんでした

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

誰か助けてもらえますか?

9
Pedro Henrique

この答え は、npmに関連する別のタスクで私のために働きました。 commandLineではなく、実行可能ファイルと引数を使用することをお勧めします。

executable 'npm' args ['install']

ディレクトリ構造によっては、workingDirプロパティを追加して、package.jsonが存在するディレクトリに設定する必要がある場合もあります。

別の方法として、 Gradle Node Plugin は、Gradleビルドで最も一般的なNodeタスクを管理するためにも非常に便利です。Iこのプラグインをmy Nodeタスクのベースとして使用し、必要に応じて他のカスタムタスクを作成します。

4
Taylor714

あなたがWindowsを使っているならこれを試してください:

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

これの代わりに:

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

Windows OSを使用している場合は、「npm」の代わりに「npm.cmd」を使用する必要があります。 OSが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'
}
1

私は @ 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はそれぞれ配列の2番目と3番目の位置になります。

0
Faraz