Gradle-plugin maven-publish: как опубликовать только конкретную публикацию в репозитории
у нас есть два разных артефакта, которые будут опубликованы в двух разных репозиториях maven.
- "ProjectXMergedWar " должно быть опубликовано в "MyMavenRepo1" (снимки)
- "ProjectXJarRelease " должно быть опубликовано в "MyMavenRepo2" (пресс-релиз)
- "ProjectXMergedWar" никогда не должен быть опубликован в "MyMavenRepo2" (release)
- " ProjectXJarRelease" никогда не следует публиковать в "mymavenrepo1" (моментальные снимки)
мы используем плагин maven-опубликовать где можно настроить множество публикаций и reposistories. Затем плагин генерирует задачи для всех комбинаций публикаций и репозиториев (см. список задач внизу). В настоящее время задачи publish
и publishRelease
- это делать то, что мы хотим, но есть задачи, которые мы не хотим.
некоторые решения могут быть:
- мы можем удалить нежелательные задачи**?
- можем ли мы настроить 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'
])
вывод из задач:
$ ./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
(...)
2 ответов
вы можете отключить и скрыть "недопустимые" задачи, например:
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" задача.публикация не была установлена в его правильное значение, но инициализирована в "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
}
}
}