2015-02-25 4 views
0

Я использую Gradle 2.3 и новый плагин maven-publish.Может ли Gradle загружать различные артефакты в различные репозитории Maven?

Возможно ли управлять плагином, чтобы он выбирал целевое репо на основе типа артефактов, которые производит проект?

Я генерирую RPM, используя 'os-package' plugin, который отлично работает. У нас также есть сервер Artifactory, настроенный для работы как jar repo, так и yum repo.

Вручную, я могу загрузить баночки в проект proj-dev-local и rpms до proj-yum-local, который отлично работает для всех зависимостей rpms и jars.

Теперь я хочу настроить задачи Gradle, чтобы опубликовать эти два типа артефактов, каждый из которых соответствует правильному репо в Artifactory.

Я понял, что официальный плагин Artifactory для Gradle не способен обрабатывать несколько изданий, но я думаю, что это должно быть возможно с использованием плагина maven-publish или какого-либо другого механизма.

Если у меня есть только артефакты jar в одном проекте и rpms в отдельном, я могу легко (ну ...) заставить его работать, используя следующую конфигурацию корневого проекта.

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath (group: 'com.netflix.nebula', name: 'gradle-ospackage-plugin', version: '2.0.3') 
    } 
} 

apply plugin: 'java' 
version = '0.1.1' 

subprojects { 
    apply plugin: 'maven-publish' 
    version = parent.version 
    plugins.withType(JavaPlugin) { 
     publishing { 
      publications { 
       mavenJava(MavenPublication) { 
        from components.java 
        repositories { 
         maven { 
          url "https://url/artifactory/proj-dev-local" 
         } 
        } 
       } 
      } 
     } 
    } 
    plugins.matching {it.class.name == "com.netflix.gradle.plugins.packaging.CommonPackagingPlugin"}.all { 
     ospackage { 
      vendor = 'myCompany' 
     } 
     publishing { 
      publications { 
       mavenRpm(MavenPublication) { 
        artifact buildRpm //buildRpm is a task added by the os-package plugin 
        repositories { 
         maven { 
          url "https://url/artifactory/proj-yum-local" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Однако, это не характер моих программных проектов - проекты Rpm - это почти все проекты Java. В нижеприведенном тестовом примере у меня есть два подпроекта: jarproject, в котором применяется только плагин «java», а также rpmproject, который применяет как «java», так и «os-package».

В rpmproject я получаю банку, опубликованную в моем yum repo, и наоборот.

Есть, например, какой-то способ изменить задачу publishMavenRpmPublicationToMavenRepository, поэтому он игнорирует определенное репо?

$ gradlew publish 
:jarproject:generatePomFileForMavenJavaPublication 
:jarproject:compileJava UP-TO-DATE 
:jarproject:processResources UP-TO-DATE 
:jarproject:classes UP-TO-DATE 
:jarproject:jar UP-TO-DATE 
:jarproject:publishMavenJavaPublicationToMavenRepository 
Uploading: test/jarproject/0.1.1/jarproject-0.1.1.jar to repository remote at https://url/artifactory/proj-dev-local 
Transferring 0K from remote 
Uploaded 0K 
:jarproject:publish 
:rpmproject:generatePomFileForMavenJavaPublication 
:rpmproject:compileJava UP-TO-DATE 
:rpmproject:processResources UP-TO-DATE 
:rpmproject:classes UP-TO-DATE 
:rpmproject:jar UP-TO-DATE 
:rpmproject:publishMavenJavaPublicationToMaven2Repository 
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.jar to repository remote at https://url/artifactory/proj-dev-local 
Transferring 0K from remote 
Uploaded 0K 
:rpmproject:publishMavenJavaPublicationToMavenRepository 
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.jar to repository remote at https://url/artifactory/proj-yum-local 
Transferring 0K from remote 
Uploaded 0K 
:rpmproject:buildRpm UP-TO-DATE 
:rpmproject:generatePomFileForMavenRpmPublication 
:rpmproject:publishMavenRpmPublicationToMaven2Repository 
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.rpm to repository remote at https://url/artifactory/proj-dev-local 
Transferring 2K from remote 
Uploaded 2K 
:rpmproject:publishMavenRpmPublicationToMavenRepository 
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.rpm to repository remote at https://url/artifactory/proj-yum-local 
Transferring 2K from remote 
Uploaded 2K 
:rpmproject:publish 

BUILD SUCCESSFUL 

EDIT: Благодаря Марку Виейры, был в состоянии получить все работает, когда я добавил следующий код, в subprojects закрытиях его, после того, как во фрагменте коды выше.

//Disable rpm publishing to jar repo and vice versa 
gradle.taskGraph.whenReady { 
    try { 
    tasks.getByPath("${project.getPath()}:publishMavenRpmPublicationToDevRepository").enabled = false; 
    } catch (UnknownTaskException e) { 
    } 
    try { 
    tasks.getByPath("${project.getPath()}:publishMavenJavaPublicationToYumRepository").enabled = false; 
    } catch (UnknownTaskException e) { 
    } 
} 

Я все еще хотел бы видеть более эстетически приятный способ, поэтому дальнейшие ответы приветствуются, но, по крайней мере, это решение делает работу для меня.

ответ

2

Вы можете просто отключить эту конкретную задачу публикации.

model { 
    tasks.publishMavenRpmPublicationToMavenRepository { 
     enabled = false 
    } 
} 

Кроме того, вы можете указать свои имена репозиториев, чтобы имена задач имели больше смысла.

maven { 
    name = 'yum' 
} 
+0

Не уверен, что будет выглядеть логика. Если я помещаю вышеуказанный код 'model' внутри замыкания' plugins.withType (JavaPlugin) {', он отключил публикацию RPM для всех проектов с Java в них, не так ли? И наоборот. Я не хочу этого. Или я неправильно понял? – Jolta

+0

Это не нужно. Gradle создает задачу для каждой комбинации публикации/хранилища. Значение, если вы объявляете две публикации и два репозитория (как вы здесь), вы получите четыре задачи публикации. Вы можете просто отключить те, которые вы не хотите запускать. –

+0

Я вижу.Но в 'jarproject' я не могу применить какую-либо конфигурацию к' publishMavenRpmPublicationToMavenRepository', потому что это не определенная задача. И наоборот. Таким образом, применение вышеуказанного предложения 'model' в закрытии' subprojects' приводит к ошибке «Проблема возникла при конфигурировании проекта: jarproject». > Следующие правила модели несвязаны: model.tasks.publishMavenRpmPublicationToMavenRepository' Я могу попытаться проверить, существует ли задача в первую очередь, но не уверен, что она сделает снимок. – Jolta