web-dev-qa-db-ja.com

Gradleでシェルスクリプトを実行する

私は、最初に環境を準備するサブディレクトリでシェルスクリプトを実行したいグラドルビルドセットアップを持っています。

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

build.dependsOn preBuild
preBuild.dependsOn myPrebuildTask

ただし、gradle myPrebuildTaskを呼び出すか、単にプロジェクトをビルドしてタスクを実行すると、次のエラーが発生します。

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

残念ながら、それだけです。
以下も試してみました-同じエラー。

commandLine 'sh mySubDir/myScript.sh'

Windowsでは、Cygwin Shell内でGradle 1.10(Androidで必要)を使用します。何か案は?

30

つかいます

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

スクリプト自体はプログラムそのものではないため、「sh」をプログラムとして宣言し、スクリプトへのパスを引数として宣言する必要があります。

25
Rene Groeschke

Execタスクを作成するより一般的な方法ですが、PATHでコマンドファイルを呼び出す場合は、Windows/Linuxに移植可能です。

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'
    }
}

これはOPのユースケースに直接対処するものではありません(作業ディレクトリにスクリプトファイルがあるため)が、質問のタイトルはより一般的であり(ここで私を描いた)、誰かに役立つかもしれません。

17
Patrice M.

残念ながらcommandLineのオプションは私にはどうにも機能せず、私の友人はexecutableで他の方法を見つけます

executable "./myScript.sh"

完全なタスクは

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

これは私のAndroidプロジェクトで私のために働く

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

説明については、こちらを参照してください。 Java/Groovyでシステムコマンドを呼び出す方法

1
pigswig