如何在Gradle中执行curl并指定目录输出?及Gradle.kts实现
解决Gradle从私有GitHub仓库下载文件到指定目录的问题
Groovy DSL 版本修改
原来的代码用-O会把文件输出到项目根目录,要指定到Android项目的res/values文件夹,得调整curl命令并确保目标目录存在,修改后的代码如下:
task myCurlTask { doLast { // 定义目标文件的完整路径,指向app模块的res/values目录 def targetFilePath = "${project.rootDir}/app/src/main/res/values/colors.xml" // 先创建目标目录(如果目录不存在的话) new File(targetFilePath).parentFile.mkdirs() // 用curl的-o参数指定输出路径,替换原来的-O def command = "curl -s -o ${targetFilePath} https://myGitHubToken@raw.githubusercontent.com/myGitHubAccount/myrepo/master/app/src/main/res/values/colors.xml" command.execute() } }
关键改动说明:
- 把
-O换成-o并带上完整目标路径,直接指定文件输出位置 - 增加目录创建逻辑,避免因目标目录不存在导致curl执行失败
- 把命令执行放在
doLast闭包里,确保任务在执行阶段才运行(原写法会在配置阶段就执行,不符合Gradle任务生命周期规范)
Kotlin DSL(build.gradle.kts)版本
对应的KTS写法如下:
tasks.register("myCurlTask") { doLast { val targetFilePath = "${project.rootDir}/app/src/main/res/values/colors.xml" // 创建目标目录 File(targetFilePath).parentFile.mkdirs() val command = "curl -s -o $targetFilePath https://myGitHubToken@raw.githubusercontent.com/myGitHubAccount/myrepo/master/app/src/main/res/values/colors.xml" Runtime.getRuntime().exec(command) } }
注意事项:
- KTS中用
tasks.register注册任务,是更规范的写法 - 执行命令用
Runtime.getRuntime().exec(),和Groovy的execute()功能等效 - 路径处理和目录创建逻辑和Groovy版本一致,保证执行前提条件
额外提醒
- 别把GitHub Token硬编码在脚本里,建议用环境变量或Gradle属性传递,比如Groovy里用
System.getenv("GITHUB_TOKEN"),KTS同理 - 可以给任务添加依赖,比如让它在编译前执行:
Groovy:myCurlTask.mustRunAfter preBuild
KTS:tasks.named("preBuild") { finalizedBy("myCurlTask") }
内容的提问来源于stack exchange,提问作者freeman
相关产品推荐
相关产品推荐

