【问题标题】:Execute shell script in Gradle在 Gradle 中执行 shell 脚本
【发布时间】:2014-08-29 05:32:41
【问题描述】:

我在开始时有一个 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 上的 Cygwin shell 中使用 Gradle 1.10(Android 需要)。有什么想法吗?

【问题讨论】:

    标签: android gradle cygwin


    【解决方案1】:

    如果您在 PATH 上调用命令文件,这是一种更通用的 exec 任务编写方式,但可移植到 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 的用例(因为工作目录中有脚本文件),但问题的标题更通用(并把我吸引到这里),所以它可能对某人有所帮助。

    【讨论】:

      【解决方案2】:

      不幸的是,带有 commandLine 的选项对我没有任何作用,我的朋友用 executable

      找到了其他方式
      executable "./myScript.sh"
      

      完整的任务是

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

      【讨论】:

        【解决方案3】:

        使用

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

        您的脚本本身不是程序本身,这就是为什么您必须将“sh”声明为程序并将脚本的路径声明为参数。

        【讨论】:

        • 需要在 linux 和 windows (Cygwin) 下执行不同的命令。我最终提供了脚本名作为参数: commandLine 'sh','myScript.sh'
        • 记得把任务放到项目的gradle文件中,而不是模块的gradle文件中。
        【解决方案4】:

        你可以使用 kotlin gradle

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

        【讨论】:

          【解决方案5】:

          这适用于我的 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?

          【讨论】:

            【解决方案6】:

            我使用+x 权限将我的shell scipt 复制到/usr/local/bin,并将其用作另一个命令:

            commandLine 'my_script.sh' 
            

            【讨论】:

            • 此选项适用,但我不建议将很多文件放在 /usr/local/bin 中
            • 您确定不想删除这个答案?
            • 如果我删除,一个人不知道该怎么做。另外,它确实对我有用。
            • 虽然建议的操作“有效”,但它不允许项目是可移植的,并且需要任何需要为项目运行 gradle 构建的人手动执行步骤。
            • @JoeyG 我想这可以留在这里。它被低估了,足以让任何寻求答案的人暗示应该谨慎使用这个食谱:)
            猜你喜欢
            • 2015-05-11
            • 2016-08-16
            • 1970-01-01
            • 2011-12-06
            • 1970-01-01
            • 2017-03-27
            • 2011-05-21
            • 1970-01-01
            • 2016-03-08
            相关资源
            最近更新 更多