My Gradle构建当前在我的项目根目录下的build
目录下生成以下目录结构:
myapp/
src/
build.gradle
build/
docs/
groovydoc/* (all Groovydocs)
libs/
myapp-SNAPSHOT.jar
myapp-SNAPSHOT-sources.jar
reports/
codenarc/
main.html
test-results/* (JUnit test results)
我想添加distribution
plugin(或任何可以实现我目标的东西),让Gradle生成一个具有以下目录结构的ZIP文件:
myapp-SNAPSHOT-buildreport.zip/
tests/
(JUnit tests from build/test-results above)
reports/
main.html (CodeNarc report from build/reports/codenarc above)
api/
(Groovydocs from build/docs above)
source/
myapp-SNAPSHOT-sources.jar (from build/libs above)
bin/
myapp-SNAPSHOT.jar (from build/libs above)
阅读插件的文档后,我无法告诉如何配置它以满足这些需求。很明显我需要运行gradle distZip
,但至于如何实际配置它以产生所需的目录结构,它似乎没有提供任何文档/示例。有什么想法吗?
注意:JAR的版本显然是SNAPSHOT
,并使用-Pversion=SNAPSHOT
命令行参数传递给Gradle构建。
答案 0 :(得分:7)
我可能不会使用分发插件而只是创建一个新的自定义Zip
任务。它看起来像这样:
task buildreportZip(type: Zip, dependsOn: build) {
classifier = 'buildreport'
from('build/test-results') {
into 'tests'
}
from('build/reports/codenarc') {
into 'reports'
}
from('build/docs') {
into 'api'
}
from(sourcesJar) { // or whatever you source jar task name is
into 'source'
}
from(jar) {
into 'bin'
}
}
答案 1 :(得分:6)
Gradle Distribution plugin 会自动拥有默认值(问题是文档没有告诉我们默认值,但Gradle项目的默认结构是假定的)所以如果您的Gradle项目非常简单并且已经使用src/main/groovy
或src/main/java
,您通常只需... {/ p>
使用CopySpec反转模式,为您的into{}
(制作目录)提供from{}
的内容,而不是相反,如下所示:
apply plugin: 'groovy'
apply plugin: 'eclipse'
apply plugin: 'application'
distributions {
main {
baseName= 'vz_sde_dm'
contents {
into('bin/config') {
from 'config'
}
into('lib/samples') {
from 'samples'
}
}
}
}
请注意,我不需要为from{}
定义contents{}
,而只需要into{}s
,因为我已经使用默认的Gradle Groovy项目布局,只添加了2个额外的文件夹( config
& samples
)在我的Eclipse项目中,但与我的常规构建文件夹布局相比,我需要将这两个文件夹放入稍微不同的层次结构中。
答案 2 :(得分:0)
我也试图制作自定义布局,但在弄清楚如何从 yourProject.zip/yourProject/lib 目录中的 build/libs 中排除项目输出(并排除一般的东西)并将其放入时遇到了真正的麻烦进入 yourProject.zip/yourProject。
经过数天在 API 中搜索和摸索的数小时后,我终于找到了使用 Distribution 的实际配置和底层 CopySpec(记录为 here 和 here,分别为Gradle 5.6.1,您可以在 URL 中将 5.6.1 替换为 current 以获得最新的 API 文档,5.6.1 恰好是我正在使用的版本):
distributions {
main {
baseName = appName
contents {
filesMatching("**/${appName}.jar", {
if (it.getPath().contains('/lib/')) {
it.setPath(it.getPath().replace('lib/', ''))
}
})
into('config') {
exclude(['server.crt', 'spotbugs-exclusion-filters.xml'])
from 'src/main/resources'
}
}
}
}
对于排除,唯一有效的方法是匹配 glob 模式并通过主发行版内容 CopySpec 的 filesMatching 方法使用闭包指定正确的操作(将其复制到根 dist 目录而不是 root/lib)。您还可以看到配置的目的地是如何从根目录更改为根目录/config 目录的。也感谢 Thad 的回答,帮助指导我进行正确的构建配置。