2014-01-29 162 views
13

我们有两种不同的工件将发布到两个不同的Maven存储库。Gradle - 插件maven-publish:如何仅将特定发布发布到存储库

  • ProjectXMergedWar” 应该被发布到 “MyMavenRepo1”(快照)
  • ProjectXJarRelease” 应该被发布到 “MyMavenRepo2”(释放)
  • “ProjectXMergedWar” 应永远不会发布到“MyMavenRepo2”(发布)
  • “ProjectXJarRelease”不应该发布到“MyMavenRepo1”(快照)

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

有些解决方案可能是:

  • 我们能删除不需要的任务**?
  • 我们可以配置maven-publish到只生成两个发布任务(想要的任务*)?
  • 我们可以直接拨打正确的班级repo.publish(artifact)或类似的东西)吗?

我已看了PublishToMavenRepository的源代码。这似乎是我想要达到的行动位于protected void doPublish

* 通缉任务:

  • publishProjectXMergedWarPublicationToMyMavenRepo1Repository + generatePom
  • publishProjectXJarReleasePublicationToMyMavenRepo2Repository + generatePom

* *不必要的任务:

  • publishProjectXMergedWarPublicationToMyMavenRepo2Repository
  • publishProjectXJarReleasePublicationToMyMavenRepo1Repository

摇篮文件:从任务

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

回答

12

您可以禁用和隐藏,像这样的 “无效” 的任务:

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

克努特,你的回答似乎不错,但由于某种原因,它不是为我工作了,我已经添加了一个新的职位和我的解决方案,如果你可以看看。 – Lifely

2

我刚刚开始玩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                     
    }                        
    }                        
}