【问题标题】:How can Gradle build an Rpm containing the outputs of some subprojects?Gradle 如何构建包含某些子项目输出的 Rpm?
【发布时间】:2014-10-31 14:30:14
【问题描述】:

我有一个多项目设置,我想从某些子项目构建 Rpm 文件,其中包含来自其他子项目的人工制品。看来我需要一些 Gradle 基础知识的帮助。

项目布局如下:

rootProject
|
|-commonLibs
|
|---serviceA
| |
| |--module1
| \--module2
|
\---serviceB
  |
  |--module3
  \--module4

这两个服务都依赖于 commonLibs。

我正在使用nebula.os-package 2.0.2 和 Gradle 2.2 快照版本。

由于服务 A 和 B 将在不同的机器上运行,我当然希望它们使用不同的 RPM。

我想要完成的是让每个 Rpms 包括:

  1. commonLibs 的输出(jar)(或者可能是所有依赖 jar,甚至)
  2. 子模块的某些工件(jar 和资源文件)

我宁愿避免列出要包含的每个文件,因为我稍后会添加更多子模块。我们当然可以在这里利用 Gradle 的按惯例构建机制。

所以,我想我会在 serviceA 和 serviceB 的 build.gradle 中做这样的事情:

apply plugin: 'os-package'
ospackage {
   ext.outputFiles = []
   project.childProjects.each {
     jar.outputs.files.each { File f ->
        outputs.add (f)
     }
   }
   from files(outputFiles) {
     into '/opt/mybusiness/product/lib'
   }
}

显然,这是行不通的:

gradlew serviceA:buildRpm
[...]
* What went wrong:
A problem occurred evaluating project ':serviceA'.
> Could not find property 'jar' on com.netflix.gradle.plugins.packaging.ProjectPackagingExtension_Decorated@2805c769.

好的,serviceA不是Java项目,所以我没有应用java插件,只有os-package插件。然而,子模块都应用了“java”插件,所以我假设我可以从each 闭包访问它们的 jar 任务。这一定是构建顺序问题。对吧?

在我的位置上,我应该做什么?欢迎使用 nebula.os-package 的多项目构建策略示例。我一直在网上搜索,但找不到任何东西。

【问题讨论】:

    标签: java gradle rpm


    【解决方案1】:

    我想,像这样的东西应该可以解决问题 - 添加到 build.gradle of :serviceA & :serviceB

    configurations {
        commonJars
    }
    
    dependencies {
        commonJars project( path: ':commonLibs' ) // might be needed to add 'configuration' as well
    }
    
    ospackage {
        from configurations.commonJars
        ..
    }
    

    【讨论】:

    • 看起来很有希望,但我在 ConfigurationContainer 类上找不到collect() 方法,Gradle 也找不到:> Could not find method collect() for arguments [build_cxsc6r4a708h9nwfqzteojnjd$_run_closure2_closure5@3a6887f7, build_cxsc6r4a708h9nwfqzteojnjd$_run_closure2_ closure6@5a355bd4] on configuration ':serviceA:commonJars'.
    • 我们正在 gradle 2.1、1.11 上运行这种设置(尽管使用 zip/tar 任务),并且工作正常.. 不确定 ospackage,期望相同的行为(鉴于他们文档)
    • 再看一遍,实际上你可以省略“.collect {it}”,因为它没有附加值..(groovy 集合上的收集方法)。顺便说一句:在 ConfigurationContainer 类中没有寻找 collect 方法,但在 Container 类中......
    • 是的,确实,这使得它构建成功,并且完全按照它应该做的(即包括 commonLibs jars)。编辑您的答案以反映正确的语法。
    • 更重要的是,这个解决方案还在我的 RPM 中包含了 :commonLibs 的所有依赖项。完美!
    猜你喜欢
    • 2022-01-10
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2018-07-11
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多