Gradle:将多个项目分发合并到一个分发中

时间:2015-04-06 16:00:26

标签: gradle build.gradle

我正在开发一个gradle多项目(java),其中一些子项目是应用程序(具有主类,并且是可执行的),而另一些是库(例如,最终被打包为jar) ,其他一些子项目定义依赖)。它工作正常。

我希望能够打包(tar)整个项目进行生产,根据一些结构,我的用户可以在以后轻松部署和使用。

目前, distTar 任务为每个应用程序项目创建build/distribution/project-name.tar,并为每个项目构建目录下的每个非应用程序项目创建build/libs/project-name.jar。这是朝着正确方向迈出的一步,但我想将内容合并为一件我可以分发的内容。

举个例子,现在运行 distTar 之后:

myapp/
  README
  docs/
  services/
    service1/
      build/
        libs/service1.jar
        <other build dirs I don't want to distribute>
    service2/
      build/
        distributions/service2.tar
        <other build dirs I don't want to distribute>
    service3/
      build/
        distributions/service3.tar
        <other build dirs I don't want to distribute>

和service2.tar的内容是:

service2/lib/service2.jar
service2/lib/some-service2-dependency.jar
service2/bin/service2 (start script)
service2/config.yml

(对于service3.tar也是如此)。

我希望我的最终结果是单个myapp.tar(.gz),其中包含类似的目录结构,但只包含生产文件:

README
docs/
services/
  service1/
    lib/service1.jar
  service2/
    lib/service2.jar
    lib/some-service-dependency.jar
    bin/service2 (start script)
    config.yml
  service3/
    lib/service3.jar
    lib/some-service-dependency.jar
    bin/service3 (start script)
    config.yml

不确定实现此类任务的最佳方式是什么。我是否创建了一个依赖于distTar的父级任务,并复制文件,解压缩等等? (试过没那么成功)。

非常感谢!

更新: 我开始沿着这些方向做点什么:

distributions {
    main {
        contents {
            into('scripts') {
                from {'scripts/sbin'}
            }
            into('service1') {
                from {tarTree(tarFileForProject("service1"))}
            }
            into('service2') {
                from {tarTree(tarFileForProject("service2"))}
            }
            into ...
        }
    }
}
distTar.dependsOn([subprojects.clean, subprojects.distTar])

(其中tarFileForProject是一个简单的函数,它返回给定子项目名称的build / distributions / * .tar文件的路径。)

它似乎有用,但也看起来很难看。我想知道是否有更清洁的方法来做到这一点。

0 个答案:

没有答案