Package Gradle多项目分布

Package Gradle多项目分布,package,gradle,multi-project,Package,Gradle,Multi Project,我正在尝试对一个多项目构建做一个区分。根项目如下所示: apply plugin: 'distribution' version 1.0 distributions { main { baseName = 'someName' contents { from 'nodes' into 'nodes' } } } subprojects { apply java... ...

我正在尝试对一个多项目构建做一个区分。根项目如下所示:

apply plugin: 'distribution'
version 1.0
distributions {
    main {
        baseName = 'someName'
        contents {
            from 'nodes' 
        into 'nodes'
        }
    }
}
subprojects {
   apply java...
   ...

   // pseudocode
   jack into the root project dist plugin
   put my produced jars and dependencies in a folder with my name
   ...
}
它只是将包含一些文件的文件夹复制到dist

现在,我希望每个子项目都将其内容注入dist。我希望添加每个子项目jar、任何依赖项,以及可能的一些其他文件等

我不知道如何从子项目注入到根项目。我甚至应该做那样的事吗?我的意思是这样的:

apply plugin: 'distribution'
version 1.0
distributions {
    main {
        baseName = 'someName'
        contents {
            from 'nodes' 
        into 'nodes'
        }
    }
}
subprojects {
   apply java...
   ...

   // pseudocode
   jack into the root project dist plugin
   put my produced jars and dependencies in a folder with my name
   ...
}
有没有人举过任何例子,或者只是给我指出了正确的方向


谢谢

我也在找同样的东西。通过浏览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
            }
        }
    }
}
apply插件:'distribution'
分配{
主要{
内容{
进入(‘bin’){
来自{project(':subproject1').startScripts.outputs.files}
来自{project(':subproject2').startScripts.outputs.files}
fileMode=0755
}
进入('lib'){
def libs=[]

libs我找到了一个对我来说很有效的解决方案。关键是你添加一个单独的子项目来创建dist。这个子项目与其他子项目是同级的。也就是说,不要试图在你的顶级
build.gradle
文件中编写分发脚本

让我们调用新的子项目
dist
。首先要做的是将其添加到多项目根目录中的顶级
设置中。gradle
文件:

include "subproject1", "subproject2", "subproject3", ....... , "dist"
您的
dist
项目必须至少包括:

  • build.gradle
    -将在下面详细说明
  • src/main/dist/至少一个\u dummy\u file.txt
    -分发插件始终需要一个
    src/main/$distribution.name
    目录。拥有一个带有
    distribution.name
    main
    的非空目录会诱使插件遵循所有
    main
    源集的所有可传递依赖项兄弟姐妹项目
接下来是
dist
项目的
build.gradle
文件:

/* 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
dist/build/distributions
中的
ZIP
文件将有一个
lib
子目录,其中包含您想要的每个
JAR
:兄弟项目
JAR
及其可传递的依赖项

由于我们使用了欺骗,分发插件将生成一个名为
dist-${version}的空
JAR
.jar
。出于美观的原因,我使用上面的
exclude
调用将其删除,但它是无害的。如果
src/main/dist
下确实没有您想要包含的内容,您也可以使用第二个
exclude
调用来删除
至少一个\u dummy\u文件.txt
。如果您不想添加任何工件d/或者删除这里提到的内容,那么您甚至不需要
内容
部分


我还发现了一些方法,可以根据这是“开发”还是“产品”发行版,以及la Maven配置文件,选择性地包含不同的工件。如果你想让我添加这些内容,请发表评论,我会的。

我实际上是通过结合pvdissel和sparc_spread的方法来实现的

在我的根项目中,我创建了一个目录
src/main/dist
,在那里我只放了一个名为
.gitcept
的文件

我的根项目的
build.gradle
文件如下所示:

apply插件:“java库发行版”
所有项目{
....
}
依赖关系{
//让根项目依赖于所有具有
//启用应用程序插件
project.subprojects.each{p->
p、 plugins.withType(ApplicationPlugin){
编译p
}
}
}
分配{
主要{
内容{
//从存档中排除不必要的文件
排除“.gitkeep”
排除“cs3d工具箱-${version}.jar”
//添加所有具有
//已为存档启用应用程序插件
project.subprojects.each{p->
p、 plugins.withType(ApplicationPlugin){
进入(‘bin’){
从{p.startScripts.outputs.files}
fileMode=0755
}
}
}
}
}
}

对我来说效果很好。使用Gradle 2.0进行了测试。

这是我在一个包含多个库的项目中使用的设置,用于创建“发布”存档:

使用
distZip
任务创建一个归档文件,所有库的文件分为三个文件夹(
lib
包含实际的JAR,
src
包含带源的JAR,
doc
包含-你猜到了-Javadoc JAR)。

就这么简单

distributions {
    main {
        contents {
            into('lib') {
                from subprojects*.jar
                from subprojects*.configurations.runtimeClasspath
            }
            into('doc') {
                from subprojects*.javadocJar
            }
        }
    }
}