如何配置Gradle自定义Task先于Configuration、compile及依赖解析执行
核心原因
- Gradle 默认自定义 Task 运行在执行阶段,而依赖声明的解析、版本读取发生在更早的配置阶段,配置阶段读取
versions.kotlin时变量还未赋值,因此报错。 - 你依赖声明中使用单引号包裹字符串,Groovy 单引号不支持变量插值,即便变量有值也不会被替换。
解决方法
方案1:将下载、读取逻辑直接放到配置阶段执行(最稳定)
不需要封装为 Task,直接在build.gradle开头、dependencies块之前编写逻辑,配置阶段就会完成文件下载和变量赋值,后续依赖读取时可直接拿到值。
示例代码:
// 放在build.gradle最顶部,dependencies块之前 def configFile = file("./remote-version.config") // 替换为你的配置文件存储路径 // 原Task A的下载逻辑直接写在配置段 if (!configFile.exists()) { // 替换为你自己的远端下载逻辑,比如ant.get、http请求等 ant.get(src: "https://你的远端配置文件地址", dest: configFile, usetimestamp: true) } // 原Task B的读取赋值逻辑直接写在配置段 ext.versions = [ kotlin: '1.1.1' // 替换为你从配置文件读取的逻辑 ]
修改依赖声明,将单引号替换为双引号,支持变量插值:
dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" }
方案2:需保留自定义Task的场景
如果一定要将逻辑封装为独立Task,可以通过依赖解析回调,强制在依赖解析之前执行两个Task:
// 定义你的两个自定义Task task downloadRemoteConfig(type: DefaultTask) { doLast { // 原Task A的下载逻辑 } } task loadConfigVariable(type: DefaultTask) { dependsOn downloadRemoteConfig doLast { // 原Task B的读取赋值逻辑 ext.versions = [ kotlin: '1.1.1' ] } } // 配置依赖解析前强制执行变量加载Task configurations.all { resolutionStrategy { eachDependency { if (!tasks.loadConfigVariable.state.executed) { tasks.loadConfigVariable.actions.each { action -> action.execute(tasks.loadConfigVariable) } } } } } // 同样依赖声明用双引号做变量插值 dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" }
内容的提问来源于stack exchange,提问作者motis10
相关产品推荐
相关产品推荐

