在我的 gradle 文件中,我定义了以下任务:
task text_example <<
{
//?!? commandLine ''
println 'Fam Flinstone'
}
我想在此任务中放入一些命令行。我该怎么做?
我正在使用库自动在 Google Play 中发布。我的项目基于 Product Flavors,我需要通过命令行为我的每一种口味传递终端命令行。所以我想在 test_example
任务中传递所有命令行。
最佳答案
您基本上有两个主要方便的选择:
使用 Gradle Exec任务类型
task fooExec(type: Exec) { workingDir "${buildDir}/foo" commandLine 'echo', 'Hello world!' doLast { println "Executed!" } }
使用 Gradle Project.exec方法
task execFoo { doLast { exec { workingDir "${buildDir}/foo" executable 'echo' args 'Hello world!' } println "Executed!" } }
在这两种情况下,您都可以在闭包内使用 ExecSpec 的方法指定执行参数. 执行命令的标准输出和错误输出将重定向到 gradle 进程的 stdout 和 stderr。
编辑@2022-07-07
下面的评论中提到了一个重要的警告:Gradle 的 exec
不会像 shell(例如 Linux 上的 Bash 或 Windows 上的 CMD)那样评估命令行,它只是使用提供的参数执行指定的可执行文件。
这有一些需要牢记的隐藏后果:
要执行“命令”,需要指定一个有效的现有可执行文件。
出现这种情况的最常见情况是尝试使用由 shell 在特定操作系统上实现的“命令”并且没有可执行文件形式的可用实现(例如
echo
和 Windows 上的类似命令)。现代 shell 不支持诸如流重定向之类的“奇特”功能(尽管您仍然可以将一个进程的 stdout 重定向到另一个进程的 stdin使用两个单独的
exec
调用和自定义 IO 配置)。用户定义的别名(例如在
~/.bsahrc
中定义)不可用。
FIY:实际上不要这样做!
在 Gradle 中“轻松”获得现代 shell 功能的“常见”解决方法是实际运行 shell 进程并提供命令行作为其参数,例如如果使用 Bash:
task shellExec(type: Exec) {
workingDir "${buildDir}/foo"
commandLine 'bash', '-c', "echo 'Hello world!'"
}
但是,这种方法会立即将构建脚本绑定(bind)到特定平台,使其无法在没有该特定 shell 的平台上运行(例如,上面的示例将无法在 Windows 上运行)。
关于android - Gradle 在自定义任务中执行命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250735/