如何将Gradle子项目产物设置为任务输入?
Gradle跨项目任务依赖配置问题解决
问题描述
我的Gradle构建包含子项目:strings,其中tokenizeStrings任务会生成文件:
$ ./gradlew :strings:tokenizeStrings # 创建 strings/string_tokens.csv
根项目的generateLocalizationFiles任务需要读取该文件:
tasks.generateLocalizationFiles { inputTokensCsvFile.set(layout.projectDirectory.file("strings/string_tokens.csv")) }
目前必须手动按顺序执行两个任务,因为Gradle未识别两者的依赖关系,希望配置依赖后,只需运行:generateLocalizationFiles就能自动触发:strings:tokenizeStrings。
已尝试方案的错误分析
你参考官方文档配置了可消费/可解析配置,但报错Expected configuration ':localizedStringData' to contain exactly one file, however, it contains no files,核心问题是artifact的builtBy指向错误:
在子项目的artifacts闭包中,this指代的是当前正在配置的Artifact对象,而非tokenizeStrings任务,导致Gradle不知道该artifact需要由哪个任务生成,自然不会执行任务生成文件,最终配置中没有文件。
正确的Artifact配置方案
子项目:strings构建脚本修正
val localizationData by configurations.creating { isCanBeConsumed = true isCanBeResolved = false } tasks.tokenizeStrings { // 确保outputTokensCsvFile已正确定义为任务的输出属性 val outputCsv = outputTokensCsvFile artifacts { add("localizationData", outputCsv) { // 明确指定由tokenizeStrings任务构建当前artifact builtBy(tasks.tokenizeStrings) } } }
根项目构建脚本修正
val localizedStringData by configurations.creating { isCanBeConsumed = false isCanBeResolved = true } dependencies { localizedStringData(project(mapOf( "path" to ":strings", "configuration" to "localizationData") )) } tasks.generateLocalizationFiles { dependsOn(localizedStringData) // 通过配置获取文件,替代硬编码路径,更符合Gradle约定 inputTokensCsvFile.set(localizedStringData.singleFile) }
更简化的任务依赖方案
如果不需要通过Artifact体系共享文件,仅需触发跨项目任务执行,可直接配置任务依赖,无需额外配置:
tasks.generateLocalizationFiles { // 直接依赖子项目的tokenizeStrings任务 dependsOn(":strings:tokenizeStrings") // 读取任务的输出属性,替代硬编码路径,确保文件生成后再读取 inputTokensCsvFile.set(project(":strings").tasks.named("tokenizeStrings").flatMap { it.outputTokensCsvFile }) }
这种方式更直接,适合仅需跨项目触发任务的场景,避免配置复杂的Artifact体系。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

