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

Gradle-plugin maven publish:如何仅将特定发布发布到存储库,gradle,maven-plugin,Gradle,Maven Plugin,我们有两个不同的工件,它们将被发布到两个不同的maven存储库中 “ProjectXMergedWar”应发布到“MyMavenRepo1”(快照) “ProjectXJarRelease”应发布到“MyMavenRepo2”(发布) “ProjectXMergedWar”永远不应该发布到“MyMavenRepo2”(发布版) “ProjectXJarRelease”不应发布到“MyMavenRepo1”(快照) 我们使用这个插件,您可以在其中配置一组发布和报告。该插件然后为所有出版物和存储

我们有两个不同的工件,它们将被发布到两个不同的maven存储库中

  • ProjectXMergedWar”应发布到“MyMavenRepo1”(快照)
  • ProjectXJarRelease”应发布到“MyMavenRepo2”(发布)
  • “ProjectXMergedWar”永远不应该发布到“MyMavenRepo2”(发布版)
  • “ProjectXJarRelease”不应发布到“MyMavenRepo1”(快照)
我们使用这个插件,您可以在其中配置一组发布和报告。该插件然后为所有出版物和存储库的组合生成任务(请参见底部的任务列表)。目前,任务
publish
publishRelease
正在执行我们想要的任务,但有些任务我们不想要

一些解决方案可能是:

  • 我们能否删除不需要的任务**?
  • 我们能否将maven publish配置为只生成两个发布任务(所需任务*)
  • 我们是否可以直接调用正确的类(
    repo.publish(artifact)
    或类似的东西)
我已经查看了
PublishToEventRepository
的源代码。我想要实现的操作似乎位于
protected void doPublish

*需要的任务:

  • PublishProjectXmergedWarpPublicationMyMavenRepository+generatePom
  • PublishProjectXJAR发布出版物TomyEventRepose2Repository+generatePom
**不需要的任务:

  • PublishProjectXmergedWarpPublicationMyMavenReport2存储库
  • PublishProjectXJAR发布出版物TomyAventreporte1repository
渐变文件:

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'
])
任务的输出:

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

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

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和它的其他插件,@knut saua mathiesen解决方案真的很有趣,但它对我不起作用

在“AfterEvaluate”中,task.publication未设置为其正确值,但已初始化为“null”。因此,我尝试了其他一些方法,并提出了以下解决方案:

afterEvaluate {                                                                                   
  tasks.withType(PublishToMavenRepository).all { publishTask ->                                   
    publishTask.onlyIf { task ->                                                                  
      if (task.publication.hasProperty('repo') && task.publication.repo != task.repository.name) {
        task.enabled = false                                                                      
        task.group = null                                                                         
        return false                                                                              
      }                                                                                           
      return true                                                                                 
    }                                                                                             
  }                                                                                               
}   

当被问到这个问题时,这可能并不存在,但描述了如何实现所需的条件发布

在中使用方法
tasks.withType()
,但也使用
onlyIf{}

“Gradle允许您根据条件通过
task.onlyIf(org.Gradle.api.specs.Spec)
方法跳过任何任务。”

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

他们对
出版物
存储库
的定义如下:

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

克努特,你的答案看起来不错,但出于某种原因,它不再适用于我了,如果你能看一下的话,我已经添加了一个新的帖子和我的解决方案。
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"
        }
    }
}