我正在努力制作一个多项目构建的dist。根项目看起来像这样:
apply plugin: 'distribution'
version 1.0
distributions {
main {
baseName = 'someName'
contents {
from 'nodes'
into 'nodes'
}
}
}
它只是将包含一些文件的文件夹复制到dist。
我现在希望每个子项目将其内容注入dist。我想添加每个子项目jar,任何dependecies,可能还有一些其他文件等...
我不知道如何从子项目注入到根目录。我应该做那样的事吗?我的意思是这样的:
subprojects {
apply java...
...
// pseudocode
jack into the root project dist plugin
put my produced jars and dependencies in a folder with my name
...
}
有没有人有任何例子,或者只是指出我正确的方向?
谢谢!
答案 0 :(得分:13)
我一直在找同样的事情。通过对API文档和Gradle自己的构建文件的一些窥视,我得出以下结论:
apply plugin: 'distribution'
distributions {
main {
contents {
into('bin') {
from { project(':subproject1').startScripts.outputs.files }
from { project(':subproject2').startScripts.outputs.files }
fileMode = 0755
}
into('lib') {
def libs = []
libs << project(':subproject1').configurations.runtime - project(':runner').configurations.runtime
libs << project(':subproject2').configurations.runtime
from libs
from project(':subproject1').jar
from project(':subproject2').jar
}
}
}
}
contents {}闭包是CopySpec,知道这使得使用分发插件的方式更简单:)
查看Gradle自己的子项目/发行版/发行版.gradle文件,了解使用CopySpec的一些很好的例子。
这很有效。
可悲的是,目前我还不知道如何以干净的方式将其扩展到两个以上的项目。至少我们离我们更近一步了:))
答案 1 :(得分:6)
我找到了一个适合我的解决方案。关键是你添加一个单独的子项目来创建dist 。该子项目兄弟到其他子项目。也就是说,不要尝试在顶级build.gradle
文件中编写分发脚本。
让我们调用新的子项目dist
。首先要做的是将它添加到多项目根目录中的顶级settings.gradle
文件中:
include "subproject1", "subproject2", "subproject3", ....... , "dist"
您的dist
项目必须至少包括:
build.gradle
- 详情如下src/main/dist/at_least_one_dummy_file.txt
- 分发插件始终需要src/main/$distribution.name
目录。拥有distribution.name
main
main
的非空的插件会使插件跟踪所有兄弟项目的所有build.gradle
源集的所有传递依赖关系。接下来,dist
项目的/* Hook in all sibling project jars and their transitive dependencies */
apply plugin: 'java'
dependencies {
compile project(':subproject1')
compile project(':subproject2')
compile project(':subproject3')
. . .
}
/* Distribution */
apply plugin: 'java-library-distribution'
distributions {
main {
baseName = "your-top-level-project-name"
contents {
exclude "dist-${version}.jar"
. . .
}
}
}
文件:
gradle distZip
然后运行ZIP
。 dist/build/distributions
中的lib
文件将包含一个JAR
子目录,其中包含您想要的每个JAR
:兄弟项目JAR
及其传递依赖项。
由于我们使用的技巧,分发插件将使dist-${version}.jar
为空exclude
。出于美观原因,我通过上面的exclude
调用将其删除,但它是无害的。如果at_least_one_dummy_file.txt
下确实没有要包含的内容,您还可以使用第二次src/main/dist
来删除contents
。如果您不想添加任何工件和/或删除此处提到的工件,那么您甚至根本不需要{{1}}部分。
我还找到了根据这是一个“dev”或“prod”发行版,la Maven配置文件选择性地包含不同工件的方法。如果您希望我添加,请在评论中发帖,我会。
答案 2 :(得分:3)
我实际上通过结合来自pvdissel和sparc_spread的方法来实现它。
在我的根项目中,我创建了一个目录src/main/dist
,其中我只放了一个名为.gitkeep
的文件。
我的根项目的build.gradle
文件如下所示:
apply plugin: 'java-library-distribution'
allprojects {
....
}
dependencies {
// let root project depend on all subprojects that have the
// application plugin enabled
project.subprojects.each { p ->
p.plugins.withType(ApplicationPlugin) {
compile p
}
}
}
distributions {
main {
contents {
// exclude unnecessary files from archive
exclude ".gitkeep"
exclude "cs3d-toolbox-${version}.jar"
// add start scripts of all plugins that have the
// application plugin enabled to the archive
project.subprojects.each { p ->
p.plugins.withType(ApplicationPlugin) {
into('bin') {
from { p.startScripts.outputs.files }
fileMode = 0755
}
}
}
}
}
}
对我来说效果很好。使用Gradle 2.0进行测试。
答案 3 :(得分:1)
这是我在具有多个库的项目中使用的设置,以创建&#34;发布&#34;存档:
apply plugin: 'distribution'
distributions {
main {
baseName = libVersion
contents {
project.subprojects.each { sub ->
into('lib') {
from sub.jar
}
into('src') {
from sub.sourcesJar
}
into('doc') {
from sub.javadocJar
}
}
}
}
}
使用distZip
任务创建一个包含所有库的存档,其文件分为三个文件夹(lib
包含实际的jar,src
包含带源的jar和doc
包含 - 你猜对了 - Javadoc jars)。
答案 4 :(得分:0)
就这么简单。
distributions {
main {
contents {
into('lib') {
from subprojects*.jar
from subprojects*.configurations.runtimeClasspath
}
into('doc') {
from subprojects*.javadocJar
}
}
}
}