2017-10-26 4 views
1

Ich habe die größte Zeit zu versuchen, herauszufinden, wie man einen Shell-Befehl von Gradle ausführen, da es wie Gradle macht es sehr schwierig, dies zu tun. HierLaufender Shell-Befehl von Gradle Skript

ist der Befehl:

git branch --merged | grep -v \* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D 

Es ist nur eine Bequemlichkeit Befehl Ortsvereine zu bereinigen, die zusammengeführt wurden. Hier

ist die Aufgabe, die ich erstellt:

task gitCleanLocalBranches { 
    doLast { 
     exec { 
      workingDir '.' 
      commandLine 'git branch --merged | grep -v \\* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D' 

     } 
    } 
} 

Die Aufgabe schlägt mit:

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':gitCleanLocalBranches'. 
> A problem occurred starting process 'command 'git branch -a'' 

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

* Exception is: 
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':gitCleanLocalBranches'. 
     at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100) 
     ... 
Caused by: org.gradle.process.internal.ExecException: A problem occurred starting process 'command 'git branch --merged | grep -v \* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D'' 
     at org.gradle.process.internal.DefaultExecHandle.execExceptionFor(DefaultExecHandle.java:222) 
     ... 3 more 
Caused by: net.rubygrapefruit.platform.NativeException: Could not start 'git branch --merged | grep -v \* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D' 
     at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:27) 
     ... 4 more 
Caused by: java.io.IOException: Cannot run program "git branch --merged | grep -v \* | grep -v master | grep -v develop | grep -v dmz | xargs git branch -D" (in directory "/home/wlaw/sterlib"): error=2, No such file or directory 
     at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25) 
     ... 6 more 
Caused by: java.io.IOException: error=2, No such file or directory 
     ... 7 more 

Also dachte ich, dass der Befehl zu kompliziert ist, so habe ich versucht, etwas einfacher, und änderte commandLine zu:

commandLine 'git branch -a' 

Aber ich habe genau den gleichen Fehler. Warum kann Gradle in der Umgebungsvariablen PATH nichts finden?

Antwort

2

Der Befehl auszuführen und ihre Argumente separate Parameter sein muss, wie dies commandLine, weitergeben müssen:

commandLine 'git', 'branch', '-a' 

Wenn Sie eine komplizierte Pipeline wie in Ihrem ersten Beispiel ausführen möchten Sie wickeln Sie es in ein Shell-Skript.

Das kann ich nicht testen, aber ich denke, das sollte auch funktionieren:

commandLine 'sh', '-c', 'git branch --merged | grep -v -e \* -e master -e develop -e dmz | xargs git branch -D' 

Hinweis: Ich habe die Freiheit nahm, und vereinfacht die grep ein bisschen.

Schließlich können Sie auch einen Git-Alias ​​in Ihrem .gitconfig erstellen, um die komplexe Pipeline zu umbrechen.

+0

Zu Ihrem ersten Punkt, das ist sicherlich ärgerlich und so scheinbar unnötig kompliziert, vor allem für einzelne Befehle mit vielen Argumenten. Aber zu deinem zweiten Punkt hoffte das etwas, was ich nicht tun müsste, da dies wirklich nur ein Einzeiler ist, wodurch eine ganze neue Datei Gradle's Problem zu umgehen scheint, da es nicht möglich ist, nur einen Shell-Befehl auszuführen in build.gradle. – wheeler

+0

re: einfach einen Shell-Befehl ausführen. In Unix werden Pipes zum Trennen mehrerer Befehle verwendet. Sie können es einen Einzeiler nennen, wenn Sie mögen, aber es stellt immer noch mehrere Befehle dar. –

+0

@wheeler Ich habe meiner Antwort zwei weitere Alternativen hinzugefügt, die für Sie geeignet sein könnten. – janos