Gradle - 插件maven-publish:如何仅将特定发布发布到存储库

HNy*_*ard 18 gradle maven-plugin

我们有两个不同的工件将发布到两个不同的maven存储库.

  • " ProjectXMergedWar "应该发布到" MyMavenRepo1 "(快照)
  • " ProjectXJarRelease "应该发布到" MyMavenRepo2 "(发布)
  • 永远不要将"ProjectXMergedWar"发布到"MyMavenRepo2"(发布)
  • 永远不要将"ProjectXJarRelease"发布到"MyMavenRepo1"(快照)

我们使用插件maven-publish配置一组发布和reposistories.然后,插件为发布和存储库的所有组合生成任务(请参阅底部的任务列表).目前的任务publishpublishRelease正在做我们想要的,但有一些我们不想要的任务.

一些解决方案可能是:

  • 我们可以删除不需要的任务吗?
  • 我们可以将maven-publish配置为仅生成两个发布任务(所需任务*)吗?
  • 我们可以直接调用正确的类(repo.publish(artifact)或类似的东西)吗?

我查看了源代码PublishToMavenRepository.似乎我想要实现的行动位于protected void doPublish.

*通缉任务:

  • publishProjectXMergedWarPublicationToMyMavenRepo1Repository + generatePom
  • publishProjectXJarReleasePublicationToMyMavenRepo2Repository + generatePom

**不需要的任务:

  • publishProjectXMergedWarPublicationToMyMavenRepo2Repository
  • publishProjectXJarReleasePublicationToMyMavenRepo1Repository

Gradle文件:

apply plugin: 'maven-publish'
publishing {
    publications {
        ProjectXMergedWar(MavenPublication) {
            artifact mergeWar
            artifactId = 'projectx'
        }
        ProjectXJarRelease(MavenPublication) {
            artifact releaseJar
            artifactId = 'projectx'
        }
    }
    repositories {
        maven {
            name 'MyMavenRepo1'
            url 'http://artifactory/url/our-snapshot-local'
            credentials { (...) }
        }
        maven {
            name 'MyMavenRepo2'
            url 'http://artifactory/url/our-release-local'
            credentials { (...) }
        }
    }
}

task publish(dependsOn: [
    'generatePomFileForProjectXMergedWarPublication',
    'publishProjectXMergedWarPublicationToMyMavenRepo1Repository'
], overwrite: true) {
    // We override the normal publish which would have tried to publish all combinations of defined
    // publications and repositories:
    // - publishProjectXMergedWarPublicationToMyMavenRepo1Repository      (we use this in normal snapshot publish)
    // - publishProjectXMergedWarPublicationToMyMavenRepo2Repository      (not to be used)
    // - publishProjectXJarReleasePublicationToMyMavenRepo1Repository     (not to be used)
    // - publishProjectXJarReleasePublicationToMyMavenRepo2Repository     (we use this one in publishRelease)
}
task publishRelease(dependsOn: [
    'generatePomFileForProjectXJarReleasePublication',
    'publishProjectXJarReleasePublicationToMyMavenRepo2Repository'
])
Run Code Online (Sandbox Code Playgroud)

任务输出:

$ ./gradlew tasks

(...)

Publishing tasks
----------------
generatePomFileForProjectXJarReleasePublication - Generates the Maven POM file for publication 'ProjectXJarRelease'.
generatePomFileForProjectXMergedWarPublication - Generates the Maven POM file for publication 'ProjectXMergedWar'.
publishProjectXJarReleasePublicationToMavenLocal - Publishes Maven publication 'ProjectXJarRelease' to the local Maven repository.
publishProjectXJarReleasePublicationToMyMavenRepo1Repository - Publishes Maven publication 'ProjectXJarRelease' to Maven repository 'MyMavenRepo1'.
publishProjectXJarReleasePublicationToMyMavenRepo2Repository - Publishes Maven publication 'ProjectXJarRelease' to Maven repository 'MyMavenRepo2'.
publishProjectXMergedWarPublicationToMavenLocal - Publishes Maven publication 'ProjectXMergedWar' to the local Maven repository.
publishProjectXMergedWarPublicationToMyMavenRepo1Repository - Publishes Maven publication 'ProjectXMergedWar' to Maven repository 'MyMavenRepo1'.
publishProjectXMergedWarPublicationToMyMavenRepo2Repository - Publishes Maven publication 'ProjectXMergedWar' to Maven repository 'MyMavenRepo2'.
publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache.

(...)

Other tasks
-----------
(...)
publish
publishRelease
(...)
Run Code Online (Sandbox Code Playgroud)

Knu*_*sen 18

您可以禁用和隐藏"无效"任务,如下所示:

apply plugin: 'maven-publish'

publishing {
    repositories {
        maven {
            name 'Dev'
            url 'http://dev/'
            credentials {
                username 'username'
                password 'password'
            }
        }

        maven {
            name 'Prod'
            url 'http://prod/'
            credentials {
                username 'username'
                password 'password'
            }
        }

    }

    publications {
        // This will only be enabled on Dev
        MyDevJar(MavenPublication) {
            artifactId "test"
            version "1.0"
            groupId "org.example"
            artifact file('abc')
            ext.repo = 'Dev'
        }

        // This will only be enabled on prod
        MyJar(MavenPublication) {
            artifactId "test"
            version "1.0"
            groupId "org.example"
            artifact file('abc')
            ext.repo = 'Prod'
        }
    }
}

afterEvaluate {
    tasks.withType(PublishToMavenRepository) { task ->
        if (task.publication.hasProperty('repo') && task.publication.repo != task.repository.name) {
            task.enabled = false
            task.group = null
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


TT-*_*T-- 5

当问题被提出时,这可能并不存在,但Gradle 文档描述了如何实现所需的条件发布。

使用已接受答案tasks.withType()中的方法,但也使用块。onlyIf{}

“Gradle 允许您通过该方法根据条件跳过任何您想要的任务Task.onlyIf(org.gradle.api.specs.Spec)。”

因此,他们的示例使用存储库名称发布类型的条件:

tasks.withType(PublishToMavenRepository) {
    onlyIf {
        (repository == publishing.repositories.external &&
            publication == publishing.publications.binary) ||
        (repository == publishing.repositories.internal &&
            publication == publishing.publications.binaryAndSources)
    }
}
tasks.withType(PublishToMavenLocal) {
    onlyIf {
        publication == publishing.publications.binaryAndSources
    }
}
Run Code Online (Sandbox Code Playgroud)

他们定义publications如下repositories

publishing {
    publications {
        binary(MavenPublication) {
            from components.java
        }
        binaryAndSources(MavenPublication) {
            from components.java
            artifact sourcesJar
        }
    }
    repositories {
        // change URLs to point to your repos, e.g. http://my.org/repo
        maven {
            name = 'external'
            url = "$buildDir/repos/external"
        }
        maven {
            name = 'internal'
            url = "$buildDir/repos/internal"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)