Gradle多项目分发

时间:2013-07-17 20:35:27

标签: package gradle multi-project

我正在努力制作一个多项目构建的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
   ...
}

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

谢谢!

5 个答案:

答案 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的一些很好的例子。

这很有效。

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

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

答案 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

然后运行ZIPdist/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
            }
        }
    }
}