Я использую 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) {
}
}
Я все еще хотел бы видеть более эстетически приятный способ, поэтому дальнейшие ответы приветствуются, но, по крайней мере, это решение делает работу для меня.
Не уверен, что будет выглядеть логика. Если я помещаю вышеуказанный код 'model' внутри замыкания' plugins.withType (JavaPlugin) {', он отключил публикацию RPM для всех проектов с Java в них, не так ли? И наоборот. Я не хочу этого. Или я неправильно понял? – Jolta
Это не нужно. Gradle создает задачу для каждой комбинации публикации/хранилища. Значение, если вы объявляете две публикации и два репозитория (как вы здесь), вы получите четыре задачи публикации. Вы можете просто отключить те, которые вы не хотите запускать. –
Я вижу.Но в 'jarproject' я не могу применить какую-либо конфигурацию к' publishMavenRpmPublicationToMavenRepository', потому что это не определенная задача. И наоборот. Таким образом, применение вышеуказанного предложения 'model' в закрытии' subprojects' приводит к ошибке «Проблема возникла при конфигурировании проекта: jarproject». > Следующие правила модели несвязаны: model.tasks.publishMavenRpmPublicationToMavenRepository' Я могу попытаться проверить, существует ли задача в первую очередь, но не уверен, что она сделает снимок. – Jolta