使用Gradle将模块化库发布到Maven

gradle dependencies publishing modularity maven-publish

1213 观看

1回复

78110 作者的声誉

假设我正在使用Gradle进行模块化库开发。在我的根项目我有子项目geometryalgorithmsvisualizer,我想每发布一个罐子神器。

至于现在,在我的根中,build.gradle我有以下部分:

apply plugin: 'maven-publish'
publishing {
    publications {
        publishDemos(MavenPublication) {
            groupId 'ru.ifmo.ctddev.igushkin.cg'
            artifactId 'geometry'
            version globalVersion
            artifact project(':geometry').tasks.getByName('jar')
        }
        publishAlgorithms(MavenPublication) {
            groupId 'ru.ifmo.ctddev.igushkin.cg'
            artifactId 'algorithms'
            version globalVersion
            artifact project(':algorithms').tasks.getByName('jar')
        }
        publishVisualizer(MavenPublication) {
            groupId 'ru.ifmo.ctddev.igushkin.cg'
            artifactId 'visualizer'
            version globalVersion
            artifact project(':visualizer').tasks.getByName('jar')
        }
    }
}

我的第一个问题:描述出版物的方式是否更短?例如,我想指出,对于每个子项目,我都需要一个带有artifactId名称集的出版物。


接下来,我的子项目相互依赖,algorithms并且都visualizer依赖于from的类geometry,但是此时jars不包含依赖项,例如,用户必须向两者都添加依赖项,geometry并且algorithms如果要使用,则必须添加依赖项algorithms

因此,有没有一种方法可以提供某种自动依赖关系,以便添加algorithms也可以添加geometry?如果是,该怎么办?如果没有,提供模块化库的惯用方式是什么?我应该用依赖项组装罐子吗?

UPD:我对,而不是artifact ...我应该使用from project(':...').components.java,因为它会同时获取工件和依赖项吗?如果使用,如何分别选择依赖项artifact ...

作者: hotkey 的来源 发布者: 2016 年 2 月 2 日

回应 (1)


9

15029 作者的声誉

决定

通过将相同的发布配置注入到每个子项目中,可以减少冗长的发布声明。例如,对于具有以下结构的多重构建项目:

ROOT
│   build.gradle
│   settings.gradle
├───subA
│       build.gradle
│
├───subB
│       build.gradle
│
└───subC
        build.gradle

在您的根目录中build.gradle,您可以执行以下操作:

apply plugin:'maven-publish'

subprojects{
    publishing {
        publications {
            "$project.name"(MavenPublication) {
                groupId project.group
                artifactId project.name
                version project.version
                from components.java
            }
        }
    }
}

每个子项目都定义自己的groupid和版本,如下所示:

group = 'org.test.sample.A'
version = '1.0'

artifactId是从子项目名称中选取的。运行gradle publish会生成以下结构的存储库:

org
└───test
    └───sample
        ├───A
        │   └───subA
        │       └───1.0
        │               subA-1.0.jar
        │               subA-1.0.pom
        ├───B
        │   └───subB
        │       └───1.0
        │               subB-1.0.jar
        │               subB-1.0.pom
        └───C
            └───subC
                └───1.0
                        subC-1.0.jar
                        subC-1.0.pom

依存关系

此配置还自动处理依赖项。例如,如果在子项目中,subA您有:

dependencies{
    compile project(':subB')
}

由于我使用from components.java而不是artifact,因此插件知道要查找依赖项并为此生成一个pom subA,包括:

  <dependencies>
    <dependency>
      <groupId>org.gradle.sample.B</groupId>
      <artifactId>subB</artifactId>
      <version>1.0</version>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
作者: RaGe 发布者: 02.02.2016 02:51
32x32