2015-07-14 9 views
10

Próbowałem wywołać npm w mojej kompilacji Gradle. Urządzenie npm jest instalowane za pośrednictwem homebrew w /usr/local/bin. Gradle nie uda się znaleźć npm podczas jego wykonywania.Określ środowisko "PATH" nie działa podczas uruchamiania programu Gradle 'exec'

Jednak zawsze kończyło się niepowodzeniem po dodaniu zmiennej środowiskowej PATH podczas wykonywania komendy npm.

Jedynym sposobem obejścia tego problemu jest użycie bezwzględnej ścieżki dla npm, nie ma sensu używanie tego samego skryptu gradle w systemie Linux.

Czy ktoś miał podobny problem? Czy powinienem otworzyć bilet na gradle?

Poniżej jest moje build.gradle,

import org.gradle.api.tasks.Exec 
import org.apache.tools.ant.taskdefs.condition.Os 

ext { 
     npmCommand = Os.isFamily(Os.FAMILY_WINDOWS) ? 'npm.cmd' : 'npm' 
     npmPath = Os.isFamily(Os.FAMILY_WINDOWS) ? '' : '/bin/:/usr/bin/:/usr/local/bin/' 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.4' 
} 
// Install packages from package.json 
task npm(type: Exec) { 
     description = "Grab NodeJS dependencies (from package.json)" 
     environment PATH: npmPath 
     workingDir = 'src/webapp' 
     commandLine = [npmCommand, "install"] 
     inputs.file "src/webapp/package.json" 
} 

Poniżej jest kompletna wyjście Gradle,

./gradlew npm -S 
:npm FAILED 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':npm'. 
> A problem occurred starting process 'command 'npm'' 

* Try: 
Run with --info or --debug option to get more log output. 

* Exception is: 
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':npm'. 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) 
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) 
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) 
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) 
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) 
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) 
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) 
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) 
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:310) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51) 
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23) 
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88) 
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37) 
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) 
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68) 
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) 
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55) 
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149) 
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106) 
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86) 
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:90) 
    at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28) 
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) 
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41) 
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28) 
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:49) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) 
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37) 
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) 
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34) 
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74) 
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72) 
    at org.gradle.util.Swapper.swap(Swapper.java:38) 
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72) 
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 
    at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47) 
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) 
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:71) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) 
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 
    at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41) 
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) 
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50) 
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246) 
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) 
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.gradle.process.internal.ExecException: A problem occurred starting process 'command 'npm'' 
    at org.gradle.process.internal.DefaultExecHandle.setEndStateInfo(DefaultExecHandle.java:196) 
    at org.gradle.process.internal.DefaultExecHandle.failed(DefaultExecHandle.java:325) 
    at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:83) 
    ... 5 more 
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) 
    ... 5 more 
Caused by: java.io.IOException: Cannot run program "npm" (in directory "/Users/kane/git/videome/wechat/src/webapp"): error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) 
    at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25) 
    ... 7 more 
Caused by: java.io.IOException: error=2, No such file or directory 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:248) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:134) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 
    ... 8 more 


BUILD FAILED 

Total time: 1.139 secs 

Zadanie będzie działać dobrze, jeśli zmiana na ścieżkę bezwzględną KMP,

npmCommand = Os.isFamily(Os.FAMILY_WINDOWS) ? 'npm.cmd' : '/usr/local/bin/npm'

+1

Od aktualizacji do OS X 10.11 mam ten sam problem. Gradle 2.7 nie może znaleźć żadnego pliku wykonywalnego w '/ usr/local/bin' bez bezwzględnej ścieżki. Uruchomienie z '--debug' pokazuje poprawną ścieżkę, w tym'/usr/local/bin'. – blootsvoets

+0

ten sam problem z El Capitanem, w moim przypadku używam hg. – nabulaer

Odpowiedz

1

Wystąpił błąd, gdy katalog src/webapp nie istniał w katalogu głównym katalogu.

skończyło się tylko następujące:

task npm(type: Exec) { 
     description "Grab NodeJS dependencies (from package.json)" 
     workingDir 'src/webapp' 
     commandLine npmCommand, "install" 
     doLast { 
      def d1 = project.file('src/webapp') 
      println "d1: $d1, ${d1.exists()}" 
     } 
} 

bez konieczności ustalania środowiska, tak długo, jak src/webapp reż został stworzony. Nie wiem, co robi twoja wartość inputs.file, npm szuka src/webapp/package.json z powodu ustawienia workingDir w zadaniu, więc usunąłem go.

Dodatkowo nie potrzebujesz importu do Exec.

Jeśli dodasz dane wyjściowe ./gradlew npm -S do swojego pytania, porównasz je z moim błędem i zobaczę, czy mogę pomóc dalej.

EDYCJA: Dodałem do bloku ostatni blok. Powinien znaleźć katalog src/webapp i wydrukować jego lokalizację i "true", jeśli istnieje, gdy katalog jest obecny podczas wykonywania zadania. Co mówi wynik?

+0

Mark, już wspomniałem o niepowodzeniu spowodowanym przez 'npm' nie znaleziono. 'Spowodowane przez: net.rubygrapefruit.platform.NativeException: Nie można uruchomić „npm” ... Spowodowany przez: java.io.IOException: błąd = 2, Nie ma takiego pliku lub katalogu \t ... 5 more' To działa dobrze, gdy używam bezwzględną ścieżkę 'npm' jako'/usr/local/bin/npm'. Próbowałem Twojej sugestii, problem nadal jest taki sam. – Kane

+0

Teraz uzyskuję mieszane wyniki. Czy możesz dodać wynik do "./gradlew npm -S" na twoje pytanie? Właśnie znalazłem błąd, jeśli nie utworzę najpierw katalogu src/webapp. Pojawia się błąd "Nie można uruchomić programu" npm "(w katalogu"/Users/markf/npm-gradle/src/webapp "): error = 2, Brak takiego pliku lub katalogu" –

+0

Błąd "Brak takiego pliku lub katalogu" działo się tak, ponieważ w moim przypadku brakuje katalogu, nie dlatego, że nie może znaleźć programu npm. Czy możesz wkleić dokładny błąd, który otrzymujesz? Tęskniłeś za tym, co mnie interesuje, komentarzem "...", ale sprawdź, czy jest tam ten katalog. –

12

Miałem ten sam problem po aktualizacji systemu operacyjnego. Dla mnie poprawka polegała na sprawdzeniu mojej zmiennej PATH i zatrzymaniu demona gradle. Następnie demon ponownie ocenia ścieżkę. Np .:

gradle --stop 
gradle npm 
+0

Wielkie dzięki. To rozwiązało mój problem. Muszę teraz zrozumieć, co demon robi pod ziemią. –

+0

co rozumiesz? Zatrzymałem demona, który rozwiązał problem. Czy to jest po prostu ponowna ocena ścieżki? –

+0

Niesamowite. Rozwiązałem podobny problem także dla mnie !! –

0

Wystarczy zmienić do tego

ext { 
    npmCommand = Os.isFamily(Os.FAMILY_WINDOWS) ? 'npm.cmd' : '/usr/local/bin/npm' 
    npmPath = Os.isFamily(Os.FAMILY_WINDOWS) ? '' : '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin' 
} 
Powiązane problemy