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