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

hot*_*key 6 dependencies modularity publishing gradle maven-publish

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

至于我的根目录,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')
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


接下来,我的子项目互相依赖,两者algorithmsvisualizer依靠来自班geometry,但在这一点上的罐子不包含依赖关系,并且,例如,用户将不得不依赖同时添加到geometryalgorithms,如果他们想使用algorithms.

那么,有没有办法提供某种自动依赖,所以添加algorithms也会添加geometry?如果是,我该怎么办?如果不是,提供模块化库的惯用方法是什么?我应该组装具有依赖性的罐子吗?

UPD:我是对的,而不是artifact ...我应该使用from project(':...').components.java,因为它会拾取工件和依赖项?如果我使用,如何单独选择依赖项artifact ...

RaG*_*aGe 9

您可以通过将相同的发布配置注入每个子项目来执行更简洁的发布声明.例如,对于具有以下结构的多构建项目:

ROOT
?   build.gradle
?   settings.gradle
????subA
?       build.gradle
?
????subB
?       build.gradle
?
????subC
        build.gradle
Run Code Online (Sandbox Code Playgroud)

在你的root中build.gradle,你可以这样做:

apply plugin:'maven-publish'

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

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

group = 'org.test.sample.A'
version = '1.0'
Run Code Online (Sandbox Code Playgroud)

artifactId从子项目名称中获取.gradle publish在此结构的repo中运行结果:

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
Run Code Online (Sandbox Code Playgroud)

依赖

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

dependencies{
    compile project(':subB')
}
Run Code Online (Sandbox Code Playgroud)

由于我使用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>
Run Code Online (Sandbox Code Playgroud)