20

我正在尝试制作多项目构建的分布。根项目如下所示:

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

它只是将包含一些文件的文件夹复制到 dist。

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

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

subprojects {
   apply java...
   ...

   // pseudocode
   jack into the root project dist plugin
   put my produced jars and dependencies in a folder with my name
   ...
}

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

谢谢!

4

5 回答 5

14

我一直在寻找同样的东西。通过查看 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 自己的 subprojects/distributions/distributions.gradle 文件,了解使用 CopySpec 的一些很好的示例。

这行得通。

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

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

于 2013-09-21T17:55:22.903 回答
7

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

让我们调用新的子项目distsettings.gradle首先要做的是将它添加到您的多项目根目录中的顶级文件中:

include "subproject1", "subproject2", "subproject3", ....... , "dist"

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

  • build.gradle- 下文详述
  • src/main/dist/at_least_one_dummy_file.txt- 分发插件总是需要一个src/main/$distribution.name目录。distribution.name拥有一个带有 a的非空 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.txtsrc/main/distcontents

我还找到了根据这是“开发”还是“产品”发行版(例如 Maven 配置文件)有选择地包含不同工件的方法。如果你想让我补充,请在评论中发表,我会的。

于 2014-05-16T17:29:13.897 回答
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 测试。

于 2014-07-25T15:21:12.650 回答
1

这是我在具有多个库的项目中用于创建“发布”存档的设置:

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
        }
      }
    }
  }
}

使用distZiptask 创建一个包含所有库的存档,其文件分为三个文件夹(lib包含实际的 jar,src包含带有源的 jar 和doc包含 - 你猜对了 - Javadoc jar)。

于 2016-04-30T13:58:45.890 回答
0

就那么简单。

distributions {
    main {
        contents {
            into('lib') {
                from subprojects*.jar
                from subprojects*.configurations.runtimeClasspath
            }
            into('doc') {
                from subprojects*.javadocJar
            }
        }
    }
}
于 2021-01-30T23:33:22.810 回答