Gradle Artifactory Plugin - Как опубликовать артефакты из нескольких модулей в проекте?
У меня есть проект, который имеет SharedCode
(Java) модуль и во-вторых Android
(Библиотека Android) модуль, который зависит от SharedCode
модуль. Я хочу опубликовать jar
артефакт из SharedCode
модуль и aar
артефакт из Android
модуль. Я не могу понять, как сочинять мои build.gradle
файлы, так что оба модуля публикуются в Artifactory, когда artifactoryPublish
задание выполнено На данный момент только SharedCode
Модуль публикует свой артефакт в Artifactory.
мой build.gradle
файлы, как показано ниже. Обратите внимание, что maven-publish
аспект моего build.gradle
файлы кажутся правильными, потому что, когда я запускаю publishToMavenLocal
задача Я вижу артефакты из обоих модулей в моей локальной папке Maven (т.е. '~/.m2/repository'
).
Во-первых, build.gradle
файл в моем SharedCode
Модуль выглядит следующим образом:
apply plugin: 'java'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'
group = "${projectGroupId}"
version = "${projectVersionName}"
dependencies {
compile 'com.google.guava:guava:18.0'
}
publishing {
publications {
SharedCode(MavenPublication) {
groupId "${projectGroupId}"
artifactId 'SharedCode'
version "${projectVersionName}"
from components.java
}
}
}
artifactory {
contextUrl = "${artifactory_url}"
publish {
repository {
repoKey = 'libs-release-local'
username = "${artifactory_username}"
password = "${artifactory_password}"
}
defaults {
publications('SharedCode')
publishArtifacts = true
properties = ['qa.level': 'basic', 'dev.team': 'core']
publishPom = true
}
}
}
Во-вторых, build.gradle
файл в моем Android
Модуль выглядит следующим образом:
apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'
group = "${projectGroupId}"
version = "${projectVersionName}"
android {
// android stuff here...
}
dependencies {
compile project(':SharedCode')
}
publishing {
publications {
Android(MavenPublication) {
groupId "${projectGroupId}"
artifactId 'Android'
version "${projectVersionName}"
artifact "$buildDir/outputs/aar/Android-release.aar"
}
}
}
artifactory {
contextUrl = "${artifactory_url}"
publish {
repository {
repoKey = 'libs-release-local'
username = "${artifactory_username}"
password = "${artifactory_password}"
}
defaults {
publications('Android')
publishArtifacts = true
properties = ['qa.level': 'basic', 'dev.team': 'core']
publishPom = true
}
}
}
Если я бегу artifactoryPublish
Задача в корне, на уровне проекта или на SharedCode
Уровень модуля, то я вижу вывод следующим образом:
18:23:38: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:SharedCode:generatePomFileForSharedCodePublication
:SharedCode:artifactoryPublish
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.jar
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.pom
Deploying build descriptor to: http://localhost:8081/artifactory/api/build Build successfully deployed.
Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375019604
BUILD SUCCESSFUL
Обратите внимание, что только SharedCode
Артефакт опубликован в этом случае.
Если я бегу artifactoryPublish
задача на Android
Уровень модуля, то я вижу вывод следующим образом:
18:25:25: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:Android:artifactoryPublish
Deploying build descriptor to: http://localhost:8081/artifactory/api/build
Build successfully deployed. Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375127269
BUILD SUCCESSFUL
Обратите внимание, что в этом случае артефакты не публикуются.
3 ответа
Если взять артефактные мультипроектные примеры на своем репозитории github, то может показаться, что только корневой проект должен иметь artifactory{...}
раздел конфигурации, в отличие от каждого подпроекта, как вы сделали.
Более того, когда вы объявляете publications('SharedCode')
в корневом проекте плагин artifactory, похоже, ищет публикацию под названием sharedCode
в каждом подпроекте.
Я бы попробовал:
Удалить
artifactory{...}
раздел от андроида build.gradleПереименуйте публикацию Android в
sharedCode
а также (или что-то более общее в обоих проектах)
Обновление: Начиная с версии
4.6.0
изcom.jfrog.artifactory
Gradle плагин публикации артефактов в многомодульном проекте просто не работает. Исходя из личного опыта, лучше всего отказаться от этого плагина и использовать стандартныеmaven-publish
плагин для модулей библиотеки Java иdigital.wup.android-maven-publish
плагин для модулей библиотеки Android.
Так что у меня наконец-то все получилось! Отдельное спасибо @RaGe за помощь в этом. Ключевыми моментами, которые следует отметить, является то, что artifactory
блок должен находиться на корневом уровне проекта build.gradle
файл, а не в build.gradle
файл отдельных модулей. Также нужно добавить artifactoryPublish.skip=true
на корневой уровень проекта build.gradle
файл. Посмотрите репозиторий GitHub для полного примера, хотя и минимально возможного:
https://github.com/adil-hussain-84/SO-35851251-Multiproject-Artifactory-Publish
Если ссылка перестает работать, я вставлю содержимое build.gradle
файлы здесь тоже. Во-первых, корневой уровень проекта build.gradle
файл:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:4.0.1'
}
}
allprojects {
apply plugin: 'com.jfrog.artifactory'
repositories {
jcenter()
}
group = "${projectGroupName}"
version = "${projectVersionName}"
}
artifactoryPublish.skip=true
artifactory {
contextUrl = "${artifactory_url}"
publish {
repository {
repoKey = 'libs-release-local'
username = "${artifactory_username}"
password = "${artifactory_password}"
}
defaults {
publications('SomePublication')
publishArtifacts = true
properties = ['qa.level': 'basic', 'dev.team': 'core']
publishPom = true
}
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.8'
}
Во-вторых, build.gradle
файл из Android
модуль:
apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 19
targetSdkVersion 23
versionCode Integer.parseInt("${projectVersionCode}")
versionName "${projectVersionName}"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile project(':SharedCode')
compile 'com.android.support:appcompat-v7:23.2.1'
testCompile 'junit:junit:4.12'
}
publishing {
publications {
SomePublication(MavenPublication) {
artifact "$buildDir/outputs/aar/Android-release.aar"
//The publication doesn't know about our dependencies, so we have to manually add them to the pom
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
//Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
configurations.compile.allDependencies.each {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
В-третьих, и наконец, build.gradle
файл из SharedCode
(Java) модуль:
apply plugin: 'java'
apply plugin: 'maven-publish'
dependencies {
compile 'com.google.guava:guava:18.0'
}
publishing {
publications {
SomePublication(MavenPublication) {
from components.java
}
}
}
Это оно!
Версия 4.2.0 плагина Gradle Artifactory была выпущена на прошлой неделе и добавила несколько хранилищ Artifactory. Теперь вы можете просто определить артефактное закрытие с другим репозиторием для разных модулей проекта.