Gradle - 插件maven-publish:如何仅将特定发布发布到存储库 [英] Gradle - plugin maven-publish: How to publish only specific publication to a repository

查看:706
本文介绍了Gradle - 插件maven-publish:如何仅将特定发布发布到存储库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




  • ProjectXMergedWar 我们有两个不同的工件将发布到两个不同的Maven仓库。 >应该发布到 MyMavenRepo1 (快照) 不得将ProjectXMergedWar发布为MyMavenRepo2(发行版)

  • ProjectXJarRelease永远不会发布到MyMavenRepo1(快照)



我们使用插件 maven-publish ,您可以在其中配置一组出版物和回购协议。然后该插件为所有发布和存储库组合生成任务(请参阅底部的任务列表)。目前,任务 publish publishRelease 正在做我们想做的事,但有些任务是我们不想要的。 p>

有些解决方案可能是:


  • 我们可以移除不需要的任务* * b

  • 我们可以配置maven-publish为只生成两个发布任务(想要的任务*)?

  • 我们可以直接调用正确的类 repo.publish(artifact)或类似的东西)?



我查看了 PublishToMavenRepository 的源代码。看起来我想要执行的操作位于 protected void doPublish 中。



* 通缉任务:


  • publishProjectXMergedWarPublicationToMyMavenRepo1Repository + generatePom

  • publishProjectXJarReleasePublicationToMyMavenRepo2Repository + generatePom



* *不需要的任务:
$ b


  • 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'
凭证{(...)}
}
maven {
name'MyMavenRepo2'
url'http:// artifactory / url / our-release-local'
凭证{(...)}
}
}
}

任务发布(dependsOn:[
'generatePomFileForProjectXMergedWarPublication',
'publishProjectXMergedWarPublicationToMyMavenRepo1Repository'
],overwrite:true){
//我们重写正常发布,试图发布定义的
//出版物和存储库的所有组合:
/ / - publishProjectXMergedWarPublicationToMyMavenRepo1Repository(我们在普通快照发布中使用它)
// - publishProjectXMergedWarPublicationToMyMavenRepo2Repository(不会被使用)
// - publishProjectXJarReleasePublicationToMyMavenRepo1Repository(不被使用)
// - publishProjectXJarReleasePublicationToMyMavenRepo2Repository(我们在publishRelease中使用这一个)
}
任务publishRelease(dependsOn:[
'generatePomFileForProjectXJarReleasePublication',
'publishProjectXJarReleasePublicationToMyMavenRepo2Repository'
])

任务输出:

  $ ./gradlew任务

(...)

发布任务
----------------
generatePomFileForProjectXJarReleasePublication - 为出版物ProjectXJarRelease生成Maven POM文件。
generatePomFileForProjectXMergedWarPublication - 为出版物ProjectXMergedWar生成Maven POM文件。
publishProjectXJarReleasePublicationToMavenLocal - 将Maven出版物ProjectXJarRelease发布到本地Maven存储库。
publishProjectXJarReleasePublicationToMyMavenRepo1Repository - 将Maven发布'ProjectXJarRelease'发布到Maven仓库'MyMavenRepo1'。
publishProjectXJarReleasePublicationToMyMavenRepo2Repository - 将Maven发布'ProjectXJarRelease'发布到Maven仓库'MyMavenRepo2'。
publishProjectXMergedWarPublicationToMavenLocal - 将Maven发布ProjectXMergedWar发布到本地Maven存储库。
publishProjectXMergedWarPublicationToMyMavenRepo1Repository - 将Maven发布'ProjectXMergedWar'发布到Maven仓库'MyMavenRepo1'。
publishProjectXMergedWarPublicationToMyMavenRepo2Repository - 将Maven发布'ProjectXMergedWar'发布到Maven仓库'MyMavenRepo2'。
publishToMavenLocal - 将此项目生成的所有Maven出版物发布到本地Maven缓存。

(...)

其他任务
-----------
(...)
发布
publishRelease
(...)


解决方案您可以禁用和隐藏无效任务,例如:

发布{
版本库{
maven {
名称'Dev'
url'http:// dev /'
credentials { b $ b用户名'用户名'
密码'密码'
}
}

maven {
name'Prod'
url'http :// prod /'
凭证{
用户名'用户名'
密码'密码'
}
}

}

publications {
//这只会在Dev
上启用MyDevJar(MavenPublication){
artifactIdtest
version1.0
groupIdorg.example
工件文件('abc')
ext.repo ='Dev'
}

//这只会在prod
上启用MyJar(MavenPublication){
artifactIdtest
版本1.0
groupIdorg.example
工件文件('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
}
}
}


We have two different artifacts that is going to be published to two different maven repositories.

  • "ProjectXMergedWar" should be published to "MyMavenRepo1" (snapshots)
  • "ProjectXJarRelease" should be published to "MyMavenRepo2" (release)
  • "ProjectXMergedWar" should never be published to "MyMavenRepo2" (release)
  • "ProjectXJarRelease" should never be published to "MyMavenRepo1" (snapshots)

We use the plugin maven-publish where you configure a set of publications and reposistories. The plugin then generates tasks for all combinations of publications and repositories (see tasks list at the bottom). Currently the tasks publish and publishRelease is doing what we want, but there are tasks we don't want.

Some solutions might be:

  • Can we remove the unwanted tasks**?
  • Can we configure maven-publish to only generate two publish tasks (the wanted tasks*)?
  • Can we call the correct classes directly (repo.publish(artifact) or something like that)?

I have looked at the source code of PublishToMavenRepository. It seems like the action I want to achive is located in protected void doPublish.

*Wanted tasks:

  • publishProjectXMergedWarPublicationToMyMavenRepo1Repository + generatePom
  • publishProjectXJarReleasePublicationToMyMavenRepo2Repository + generatePom

**Unwanted tasks:

  • publishProjectXMergedWarPublicationToMyMavenRepo2Repository
  • publishProjectXJarReleasePublicationToMyMavenRepo1Repository

Gradle file:

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'
])

Output from tasks:

$ ./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
(...)

解决方案

You could disable and hide the "invalid" tasks like so:

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

这篇关于Gradle - 插件maven-publish:如何仅将特定发布发布到存储库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆