android - studio - Ejecutar shell script en Gradle
update gradle mac (5)
Copié mi shell scipt a /usr/local/bin
con el permiso +x
y lo usé como un comando más:
commandLine ''my_script.sh''
Tengo una configuración de compilación de gradle al principio de la cual quiero ejecutar un shellscript en un subdirectorio que prepara mi entorno.
task build << {
}
task preBuild << {
println ''do prebuild stuff:''
}
task myPrebuildTask(type: Exec) {
workingDir "$projectDir/mySubDir"
commandLine ''./myScript.sh''
}
build.dependsOn preBuild
preBuild.dependsOn myPrebuildTask
Sin embargo, cuando ejecuto la tarea llamando a gradle myPrebuildTask
o simplemente creando el proyecto, se produce el siguiente error:
> A problem occurred starting process ''command ''./myScript.sh''''
Desafortunadamente, eso es todo lo que tengo.
También he intentado lo siguiente - mismo error.
commandLine ''sh mySubDir/myScript.sh''
Uso Gradle 1.10 (necesario para Android) en Windows, dentro de un shell de Cygwin. ¿Algunas ideas?
Esto funciona para mí en mi proyecto de Android
preBuild.doFirst {
println("Executing myScript")
def proc = "mySubDir/myScript.sh".execute()
proc.waitForProcessOutput(System.out, System.err)
}
Vea aquí la explicación: ¿Cómo hacer llamadas de comando del sistema en Java / Groovy?
Una forma más genérica de escribir la tarea exec, pero portátil para Windows / Linux, si está invocando un archivo de comandos en el 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''
}
}
Esto no trata directamente el caso de uso del OP (ya que hay un archivo de script en el directorio de trabajo), pero el título de la pregunta es más genérico (y me dibujó aquí), por lo que podría ayudar a alguien tal vez.
desafortunadamente, las opciones con la línea de comandos no funcionaron para mí de ninguna manera y mi amigo encuentra otra manera con el ejecutable
executable "./myScript.sh"
y la tarea completa sería
task startScript() {
doLast {
exec {
executable "./myScript.sh"
}
}
}
utilizar
commandLine ''sh'', ''./myScript.sh''
su script en sí no es un programa en sí mismo, por eso debe declarar ''sh'' como el programa y la ruta a su script como un argumento.