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"
}
誰か助けてもらえますか?
この答え は、npmに関連する別のタスクで私のために働きました。 commandLineではなく、実行可能ファイルと引数を使用することをお勧めします。
executable 'npm' args ['install']
ディレクトリ構造によっては、workingDirプロパティを追加して、package.jsonが存在するディレクトリに設定する必要がある場合もあります。
別の方法として、 Gradle Node Plugin は、Gradleビルドで最も一般的なNodeタスクを管理するためにも非常に便利です。Iこのプラグインをmy Nodeタスクのベースとして使用し、必要に応じて他のカスタムタスクを作成します。
あなたがWindowsを使っているならこれを試してください:
task npmInstall(type: Exec) {
commandLine "npm.cmd", "install"
}
これの代わりに:
task npmInstall(type: Exec) {
commandLine "npm", "install"
}
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'
}
私は @ 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番目の位置になります。