web-dev-qa-db-fra.com

Exécuter le script Shell dans Gradle

Au début de mon installation, je souhaite exécuter un script de shell dans un sous-répertoire qui prépare mon environnement. 

task build << {
}
task preBuild << {
    println 'do prebuild stuff:'
}
task myPrebuildTask(type: Exec) {
    workingDir "$projectDir/mySubDir"
    commandLine './myScript.sh'
}

build.dependsOn preBuild
preBuild.dependsOn myPrebuildTask

Cependant, lorsque j'exécute la tâche en appelant gradle myPrebuildTask ou en générant simplement le projet, l'erreur suivante se produit:

> A problem occurred starting process 'command './myScript.sh''

Malheureusement, c'est tout ce que j'ai. 
J'ai également essayé ce qui suit - même erreur.

commandLine 'sh mySubDir/myScript.sh'

J'utilise Gradle 1.10 (requis par Android) sous Windows, dans un shell Cygwin. Des idées?

26
Paul Latzelsperger

utilisation 

commandLine 'sh', './myScript.sh'

votre script lui-même n'est pas un programme, c'est pourquoi vous devez déclarer 'sh' comme programme et le chemin de votre script comme argument.

22
Rene Groeschke

Une manière plus générique d'écrire la tâche exec, mais portable pour Windows/Linux, si vous appelez un fichier de commande sur le chemin PATH:

task myPrebuildTask(type: Exec) {
    workingDir "$projectDir/mySubDir"
    if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
        commandLine 'cmd', '/c', 'mycommand'
    } else {
        commandLine 'sh', '-c', 'mycommand'
    }
}

Cela ne concerne pas directement le cas d'utilisation de l'OP (puisqu'il y a un fichier script dans le répertoire de travail), mais le titre de la question est plus générique (et m'a attiré ici), cela pourrait donc aider quelqu'un.

15
Patrice M.

malheureusement, les options avec commandLine ne fonctionnent pas pour moi et mon ami trouve un autre moyen avec executable

executable "./myScript.sh"

et la tâche complète serait

task startScript() {
  doLast {
     exec {
          executable "./myScript.sh"
      }
  }
}
5
panser

Cela fonctionne pour moi dans mon projet Android

preBuild.doFirst {
    println("Executing myScript")
    def proc = "mySubDir/myScript.sh".execute()
    proc.waitForProcessOutput(System.out, System.err)
}

Voir ici pour l'explication: Comment faire des appels de commande système en Java/Groovy?

1
pigswig