web-dev-qa-db-fra.com

Gradle n'a pas pu exécuter la commande npm

J'essaie d'exécuter une commande npm à l'intérieur de la tâche Gradle, mais j'obtiens une erreur étrange:

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

Et voici ma tâche:

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

Quelqu'un pourrait aider?

8
Pedro Henrique

Cette réponse a fonctionné pour moi avec une tâche différente liée à npm. La recommandation consiste à utiliser un exécutable et des arguments plutôt que commandLine.

executable 'npm' args ['install']  

En fonction de la structure de votre répertoire, vous devrez peut-être également ajouter la propriété workingDir et la définir dans le répertoire où réside votre package.json.

Alternativement, le Gradle Node Plugin est également très pratique pour gérer les tâches de nœud les plus courantes dans une construction Gradle. J'utilise ce plugin comme base pour mes tâches de nœud, puis crée d'autres tâches personnalisées selon les besoins.

4
Taylor714

Si vous utilisez Windows, essayez ceci:

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

au lieu de cela:

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

Si vous utilisez Windows, vous devez utiliser "npm.cmd" au lieu de "npm". Il est préférable de détecter si le système d'exploitation est Windows ou non et de créer votre commande npm. S'il vous plaît voir l'extrait de code ci-dessous,

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

J'ai utilisé @ALDRIN P VINCENT answer pour résoudre ce problème. Mais si vous devez passer des arguments de ligne de commande au script npm, vous pouvez procéder comme suit:

Disons que les propriétés système suivantes sont passées au script gradle

gradle test-Dsome1=dev -Dsome2=https://www.google.com

Dans votre script de test dans build.gradle, procédez comme suit:

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

}

La commande principale commence par commandLine npm… Cette ligne équivaut à:

npm run test -- --some1=dev --some2=https://www.google.com

Le script de test de package.json doit également comporter la commande ‘npm install’ (cela dépend) pour que les modules de noeud soient installés avant l’exécution des tests. Et si les modules sont déjà installés, le noeud ne perdra pas de temps et ne les réinstallera pas. Le script de test devrait ressembler à ceci:

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

Et ensuite, vous pouvez choisir ces arguments en ligne de commande via process.argv[2] et process.argv[3].

Si vous avez un script simple comme le mien, alors some1 et some2 seront respectivement à la 2e et à la 3e position d'un tableau.

0
Faraz Durrani