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