我有一个简单的多模块项目,我想从中创建一个发行版。我粗略希望发行版看起来像
foo/
bar/
baz/
对于每个模块,我想声明他们的工件(和依赖项)进入发行版中的foo
,bar
或baz
目录之一。
显而易见的事情似乎不起作用,Gradle文档对于artifacts
+ configurations
的确切运作方式含糊不清,所以我不确定我做错了什么。
我在根build.gradle
configurations {
foo
bar
baz
}
然后在moduleA
我提出了它的文物:
artifacts {
foo jar
}
依此类推,对于每个模块,其工件都设置为所需的配置。
如果我将它们打印出来configurations.each {c -> println(c.name) }
,则会列出这些配置,因此它们已正确创建,但如果我尝试迭代自定义配置的files
或allArtifacts
,他们是空的。
我之前通过创建辅助模块来完成这样的事情,其依赖关系将列为:
dependencies {
foo "com.mypackage.group:module:1.0"
}
然后是bar
的另一个模块,baz
的另一个模块,依此类推。这似乎有效但维护起来很麻烦。使用自定义配置和工件似乎是一种更易于维护的解决方案。
答案 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任务一起使用,因为连接起来非常重要。
您还可以循环遍历所有子项目,这些子项目具有为任务名称定义的自定义参数,以使其更加自包含在子项目中。
确保还包含一些依赖项,以便在完成清理后或新结账时调用您的任务。