【问题标题】:Gradle multi project distributionGradle 多项目分发
【发布时间】:2013-07-16 14:11:54
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: package gradle multi-project


    【解决方案1】:

    就这么简单。

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

    【讨论】:

      【解决方案2】:

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

      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 jar) .

      【讨论】:

        【解决方案3】:

        我找到了一个对我来说效果很好的解决方案。关键是您添加一个单独的子项目来创建 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 目录。拥有一个具有maindistribution.name 的非空值会诱使插件遵循所有兄弟项目的所有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 distZipdist/build/distributions 中的 ZIP 文件将有一个 lib 子目录,其中包含您想要的每个 JAR:兄弟项目 JARs 及其传递依赖项。

        由于我们使用的诡计,分发插件将创建一个名为dist-${version}.jar 的空JAR。出于美观的原因,我使用上面的exclude 调用将其删除,但它是无害的。如果src/main/dist 下确实没有您想要包含的内容,您还可以使用第二个exclude 调用来删除at_least_one_dummy_file.txt。如果您不想添加任何工件和/或删除此处提到的工件,那么您甚至根本不需要 contents 部分。

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

        【讨论】:

          【解决方案4】:

          我实际上是通过结合 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 测试。

          【讨论】:

            【解决方案5】:

            我也在寻找同样的东西。通过查看 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”行是添加该项目的jar,因为configurations.runtime似乎只包含依赖项。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-10-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-10
              • 2015-04-26
              • 1970-01-01
              相关资源
              最近更新 更多