如何获取Gradle复合构建中被包含构建的任务输出
解决Gradle复合构建中复制被包含项目输出的问题
以下是几个可行的解决方向:
1. 利用includedBuild的TaskReference获取输出
TaskReference虽然不是实际任务实例,但可以通过它声明依赖并直接引用输出。示例代码:
tasks.register<Copy>("copyIncludedBuildJars") { // 声明对被包含构建中jar任务的依赖,确保其先执行 dependsOn(gradle.includedBuild("included-build-name").task(":subproject:jar")) // 直接引用该任务的输出文件集 from(gradle.includedBuild("included-build-name").task(":subproject:jar").outputs) into("some/dir") }
核心逻辑:通过dependsOn确保被包含构建的jar任务完成,再通过outputs属性获取实际生成的文件,Gradle会自动解析跨构建的输出路径。
2. 通过依赖配置间接获取输出
如果被包含项目已作为主项目的依赖引入,可利用依赖配置过滤目标jar:
// 主项目build.gradle.kts dependencies { implementation(project(":included-subproject")) { artifact { type = "jar" builtBy(":included-subproject:jar") } } } tasks.register<Copy>("copyDependentJars") { from(configurations.runtimeClasspath) { // 过滤出目标项目的jar文件 include("*included-subproject*.jar") } into("some/dir") }
适用场景:被包含项目与主项目存在依赖关系时,无需额外处理跨构建任务引用,直接复用依赖配置。
3. 在被包含构建中暴露输出目录
修改被包含项目的构建脚本,通过扩展属性暴露jar输出目录:
// 被包含项目的build.gradle.kts val jarOutputDir by extra { jar.outputs.files.singleFile.parentFile }
然后在主构建中通过includedBuild的model机制获取该属性:
// 主项目build.gradle.kts tasks.register<Copy>("copyExposedJars") { val includedBuild = gradle.includedBuild("included-build-name") // 获取被包含构建暴露的输出目录 val jarOutputDir = includedBuild.model().get("jarOutputDir").get() from(jarOutputDir) { include("*.jar") } into("some/dir") // 确保jar任务先执行 dependsOn(includedBuild.task(":subproject:jar")) }
优势:可灵活控制输出目录的暴露方式,适合需要自定义输出路径的场景。
内容的提问来源于stack exchange,提问作者TheGates
相关产品推荐
相关产品推荐

