簡體   English   中英

在Gradle執行shell腳本

[英]Execute shell script in Gradle

我有一個 gradle 構建設置,在開始時我想在准備我的環境的子目錄中執行一個 shellscript。

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'

我在 Cygwin shell 中的 Windows 上使用 Gradle 1.10(Android 需要)。有什么想法嗎?

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

您的腳本本身不是程序本身,這就是為什么您必須將“sh”聲明為程序並將腳本的路徑聲明為參數。

一種更通用的編寫 exec 任務的方法,但對於 Windows/Linux 是可移植的,如果您在 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'
    }
}

這並沒有直接解決 OP 的用例(因為工作目錄中有腳本文件),但問題的標題更通用(並將我吸引到這里),所以它可能對某人有所幫助。

不幸的命令行選項不以任何方式工作,我和我的朋友找到可執行其它方式

executable "./myScript.sh"

完整的任務是

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

這在我的 Android 項目中對我有用

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

請參閱此處的說明: 如何在 Java/Groovy 中進行系統命令調用?

這是Kotlin DSL (build.gradle.kts) 的解決方案,源自Charlie Lee 的回答

task<Exec>("MyTask") {
    doLast {
        commandLine("git")
            .args("rev-parse", "--verify", "--short", "HEAD")
            .workingDir(rootProject.projectDir)
    }
}

使用 Java 標准ProcessBuilder API 的另一種方法:

tasks.create("MyTask") {
    val command = "git rev-parse --verify --short HEAD"
    doLast {
        val process = ProcessBuilder()
            .command(command.split(" "))
            .directory(rootProject.projectDir)
            .redirectOutput(Redirect.INHERIT)
            .redirectError(Redirect.INHERIT)
            .start()
        process.waitFor(60, TimeUnit.SECONDS)
        val result = process.inputStream.bufferedReader().readText()
        println(result)
    }
}

有關詳細信息,請參閱:

對於 kotlin gradle,您可以使用

 Runtime.getRuntime().exec("./my_script.sh")

我使用+x權限將我的 shell scipt 復制到/usr/local/bin並將其用作另一個命令:

commandLine 'my_script.sh' 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM