如何使用工件将构建工件分段为自定义配置以进行分发

时间:2016-10-10 20:32:06

标签: gradle

我有一个简单的多模块项目,我想从中创建一个发行版。我粗略希望发行版看起来像

foo/
bar/
baz/

对于每个模块,我想声明他们的工件(和依赖项)进入发行版中的foobarbaz目录之一。

显而易见的事情似乎不起作用,Gradle文档对于artifacts + configurations的确切运作方式含糊不清,所以我不确定我做错了什么。

我在根build.gradle

configurations {
    foo
    bar
    baz
}

然后在moduleA我提出了它的文物:

artifacts {
    foo jar
}

依此类推,对于每个模块,其工件都设置为所需的配置。

如果我将它们打印出来configurations.each {c -> println(c.name) },则会列出这些配置,因此它们已正确创建,但如果我尝试迭代自定义配置的filesallArtifacts,他们是空的。

我之前通过创建辅助模块来完成这样的事情,其依赖关系将列为:

dependencies {
    foo "com.mypackage.group:module:1.0"
}

然后是bar的另一个模块,baz的另一个模块,依此类推。这似乎有效但维护起来很麻烦。使用自定义配置和工件似乎是一种更易于维护的解决方案。

1 个答案:

答案 0 :(得分:1)

我认为您对getArtifacts()

感兴趣

这是一个例子

// generated with gradle init --type java-library
apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.21'
    testCompile 'junit:junit:4.12'
}

configurations {
    foo {
        extendsFrom compile
    }
}

artifacts {
    foo jar
}

task showMe << {
    println "Files:"
    configurations.foo.files.each { println "  $it" }
    println "Artifacts: "
    configurations.foo.artifacts.each { println " $it" }
}

输出:

:showMe
Files:
  /home/alpar/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.21/139535a69a4239db087de9bab0bee568bf8e0b70/slf4j-api-1.7.21.jar
Artifacts: 
 ArchivePublishArtifact_Decorated alpar:jar:jar:

你可以通过直接参考项目任务来进一步简化它(考虑到foo bar等是项目)

task distribution(type: Zip) {
   from project(':foo').jar { into "foo" }
}

task distribution(type: Zip) {
   ('foo', 'bar').each { p ->
       from project(":$p").jar { into p }
   }
}

简而言之。

似乎发布的PublishArtifact不适合与Zip任务一起使用,因为连接起来非常重要。

您还可以循环遍历所有子项目,这些子项目具有为任务名称定义的自定义参数,以使其更加自包含在子项目中。

确保还包含一些依赖项,以便在完成清理后或新结账时调用您的任务。