Gradle多项目分发

Sas*_*ian 14 package multi-project gradle

我正在努力制作一个多项目构建的东西.根项目看起来像这样:

apply plugin: 'distribution'
version 1.0
distributions {
    main {
        baseName = 'someName'
        contents {
            from 'nodes' 
        into 'nodes'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它只是将带有一些文件的文件夹复制到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
   ...
}
Run Code Online (Sandbox Code Playgroud)

有没有人有任何例子,或者只是指出我正确的方向?

谢谢!

pvd*_*sel 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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

内容{}封闭是CopySpec,明知使得使用分配插件方式简单:)

查看Gradle自己的子项目/发行版/发行版.gradle文件,了解使用CopySpec的一些很好的例子.

这有效.

  • 减法是删除重复的罐子.
  • ".jar"行将添加该项目的jar作为configurations.runtime似乎只包含依赖项.

可悲的是,目前我还不知道如何以一种干净的方式将其扩展到两个以上的项目.至少我们离我们更近一步了:)


spa*_*ead 6

我找到了一个适合我的解决方案.关键是你要添加一个单独的子项目来创建dist.该子项目是其他子项目的兄弟.也就是说,不要尝试在顶级build.gradle文件中编写分发脚本.

我们打电话给新的子项目dist.首先要做的是将它添加到settings.gradle多项目根目录中的顶级文件中:

include "subproject1", "subproject2", "subproject3", ....... , "dist"
Run Code Online (Sandbox Code Playgroud)

您的dist项目必须至少包括:

  • build.gradle - 详情如下
  • src/main/dist/at_least_one_dummy_file.txt- 分发插件总是需要一个src/main/$distribution.name目录.具有非空单用 distribution.namemain招数插件跟进所有的所有的传递依赖main的所有兄弟项目的sourcesets.

接下来,项目的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"
            . . . 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后跑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部分.

我还找到了根据这是一个"dev"或"prod"发行版,la Maven配置文件选择性地包含不同工件的方法.如果您希望我添加,请在评论中发帖,我会.