如何在Gradle Kotlin DSL中读取命令行属性并复用Git提交哈希?
在Gradle Kotlin DSL中复用Git提交哈希的最佳方式
要在Gradle构建中复用Git最新提交哈希,最符合Gradle最佳实践的方式是使用懒加载的Provider<String>,避免在配置阶段提前执行Git命令拖慢构建。
实现步骤:
创建Provider捕获Git命令输出
用providers.exec创建延迟执行的Git操作,获取并处理提交哈希:val gitCommitHash: Provider<String> = providers.exec { executable("git") args("log", "--oneline", "-1", "--format=format:%h", ".") }.standardOutput.asText.map { it.trim() }providers.exec会在实际需要哈希值时才执行Git命令(而非配置阶段)standardOutput.asText将命令输出转为文本格式map { it.trim() }移除输出中的换行符和多余空格
在其他任务中复用哈希值
你可以在任意任务中通过gitCommitHash.get()获取哈希,Gradle会自动处理依赖顺序(确保先执行Git命令再运行依赖它的任务):示例1:给Java编译任务注入系统属性
tasks.withType<JavaCompile> { options.compilerArgs.add("-Dgit.commit.hash=${gitCommitHash.get()}") }示例2:自定义任务打印哈希
tasks.register("printGitHash") { doLast { println("Latest Git commit hash: ${gitCommitHash.get()}") } }
额外优化:处理异常场景
如果当前目录不是Git仓库或Git命令执行失败,可以给Provider设置默认值:
val gitCommitHash: Provider<String> = providers.exec { executable("git") args("log", "--oneline", "-1", "--format=format:%h", ".") }.standardOutput.asText.map { it.trim() }.orElse("unknown")
为什么不直接用Exec任务存变量?
直接在配置阶段执行Exec任务捕获输出,会导致Git命令在每次构建的配置阶段都运行,拖慢整体构建速度。而Provider的懒加载机制,只会在实际需要哈希值时才执行Git命令,更贴合Gradle的任务依赖模型。
内容的提问来源于stack exchange,提问作者G. Tabs
相关产品推荐
相关产品推荐

