在Gradle中执行shell脚本

bvhaajcl  于 2023-10-19  发布在  Shell
关注(0)|答案(7)|浏览(161)

我有一个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'

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

ou6hu8tu

ou6hu8tu1#

使用

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

你的脚本本身不是一个程序,这就是为什么你必须声明'sh'作为程序,并将脚本的路径作为参数。

lvjbypge

lvjbypge2#

一种编写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的用例(因为在工作目录中有脚本文件),但是问题的标题更通用(并吸引了我),所以它可能会帮助一些人。

1szpjjfi

1szpjjfi3#

不幸的是,使用commandLine的选项在任何方面都不适合我,我的朋友找到了使用可执行文件的其他方法。

executable "./myScript.sh"

全部任务就是

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

of1yzvn44#

这在我的Android项目中很有效

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

请参阅这里的解释:How to make System command calls in Java/Groovy?

9lowa7mx

9lowa7mx5#

下面是从Charlie Lee's answer派生的Kotlin DSL(build.gradle.kts)的解决方案:

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

有关详细信息,请参阅:

dl5txlt9

dl5txlt96#

对于Kotlingradle,您可以使用

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

7ajki6be7#

我将shell scipt复制到+x,并将其用作另一个命令:

commandLine 'my_script.sh'

相关问题