Раньше я использовал плагин android gradle v2.2.2, теперь я перехожу на 3.0. Приведенный ниже код публикует (задача загрузитьАрхивы) все мои варианты в maven без каких-либо проблем с 2.14.1. Но как только я перейду на 3.0, ничего не опубликовано. Если я удалю prodcut, он опубликует версию выпуска библиотеки для maven должным образом. Я что-то пропустил? Что-то изменилось в 3.0?
Я прочитал, что теперь по умолчанию все варианты будут опубликованы, и publishNonDefault больше не нужен. После удаления publishNonDefault тоже не работает.
Я использую Gradle 4.1 с плагином 3.0 и Gradle 2.14.1 с плагином 2.2.2
apply plugin: 'com.android.library'
apply plugin: 'maven'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 17
targetSdkVersion 26
versionCode 1
versionName "1.0"
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
publishNonDefault true
flavorDimensions "app"
productFlavors{
apple{
}
orange{
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
uploadArchives {
repositories {
mavenDeployer {
repository(url: mavenLocal().url)
pom.version = "1.3.7"
pom.artifactId = "android"
pom.groupId = "com.example"
}
}
}
У меня аналогичная проблема. Хотя я не использую productFlavors, я ожидаю, что mavenDeployer опубликует три конфигурации (соответствующие моим трем типам сборки «отладка», «выпуск» и «постановка»). Но больше этого не делает, он только публикует AAR в Maven для «релизной» конфигурации.
До Android Plugin для Gradle 3.0.1 следующий код mavenDeployerсделал публикует все три файла AAR:
uploadArchives {
repositories.mavenDeployer {
repository(url:"file://" + "${project.buildDir}/maven/releases")
pom.groupId = "com.example"
pom.artifactId = "sdk"
pom.version = sdkName
}
}
Приведенный выше код Gradle используется для создания следующих 3 файлов, опубликованных в Maven:
sdk/build/maven/releases/com/locuslabs/sdk/develop/sdk-develop-debug.aar
sdk/build/maven/releases/com/locuslabs/sdk/develop/sdk-develop-staging.aar
sdk/build/maven/releases/com/locuslabs/sdk/develop/sdk-develop-release.aar
Однако после обновления до Android Plugin для Gradle 3.0.1 он производит только:
sdk/build/maven/releases/com/locuslabs/sdk/develop/sdk-develop.aar
Обратите внимание, что в имени файла нет даже суффикса -release, хотя я почти уверен, что это релизный.
Пока что ближе всего к решению я пришел к документации по новому способу публикации файлов AAR в Maven: android-maven-publish.
Фундаментальные исследования:
Из Библиотеки Android: maven vs maven-publish gradle project я узнал, что есть два механизма Gradle для публикации в Gradle. Плюс к этому есть неофициальные реализации тех.
Плагин Maven: несколько артефактов на проект
Старый, который, я думаю, вы используете, потому что вы указали apply plugin: 'maven', который задокументирован здесь Плагин Maven. Чтобы получить несколько выходных файлов AAR, предположительно вам «нужно объявить фильтр для каждого артефакта, который вы хотите опубликовать». но недостаток в том, что «вам нужно сгенерировать несколько POM» (Несколько артефактов на проект).
Maven Publishing (новое): публикация нескольких модулей
Очевидной заменой для Плагин Maven является новый, Maven Publishing (новое), который, кажется, имеет возможность публиковать несколько артефактов, как описано в Публикация нескольких модулей. По сути, кажется, что вам просто нужно иметь несколько вызовов методов в блоке publications (извините, если я использую неправильный синтаксис Gradle / Groovy - это запутанный язык, который, как мне кажется, никогда не создавался).
publishing {
publications {
impl(MavenPublication) { // for first variant?
groupId 'org.gradle.sample.impl'
artifactId 'project2-impl'
version '2.3'
from components.java
}
api(MavenPublication) { // for second variant?
groupId 'org.gradle.sample'
artifactId 'project2-api'
version '2'
artifact apiJar
}
}
}
task apiJar(type: Jar) {
baseName "publishing-api"
from sourceSets.main.output
exclude '**/impl/**'
}
Если бы это было недостаточно сложно, согласно Библиотеки Android: maven vs maven-publish gradle project, «два вышеуказанных официальных плагина не полностью поддерживают Android, поэтому есть два порта сообщества».
Плагин Gradle Android Maven (неофициальный)
Документация на Плагин Gradle Android Maven не объясняет, как мы будем выводить несколько AAR.
android-maven-publish (неофициальный)
Как упоминалось выше, документация по адресу android-maven-publish выглядит наиболее многообещающей, поскольку она предоставляет пример «публикации пользовательских вариантов», что подразумевает, что это решит вашу проблему публикации всех вариантов. Вот пример из android-maven-publish:
publishing {
publications {
android.libraryVariants.all { variant ->
"maven${variant.name.capitalize()}Aar"(MavenPublication) {
from components.findByName("android${variant.name.capitalize()}")
groupId 'digital.wup.test-publish'
artifactId 'test-publish'
version "1.0.0-${variant.name}"
}
}
}
}
Плагин Maven Publish для Android - действительно способ сделать это, как упоминалось в Хтофоя.
Вы можете ввести все варианты один за другим, как показано в документации, или сделать что-то вроде этого:
afterEvaluate {
android.libraryVariants.each { variant ->
// Only consider release
if (variant.buildType.name != "release") { return }
publishing.publications.create(variant.name, MavenPublication) {
from components.findByName(variant.name)
groupId libraryGroupId
artifactId "${libraryArtifactId}-${variant.flavorName}"
version libraryVersion
}
}
}
Пример из android-maven-publish, показанный в ответе Майкл Ософски, ошибочен и не создает правильные файлы POM
Хороший! android-maven-publish, упомянутый на его сайте, больше не нужен, если в вашем проекте используется AGP (Android Gradle Plugin) 3.6.0 или новее, поскольку он уже поддерживает maven-publish.