Как опубликовать все варианты вкуса в maven с плагином Android Gradle 3.0.0?

Раньше я использовал плагин 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"
        }
    }
}
7
0
4 438
2

Ответы 2

У меня аналогичная проблема. Хотя я не использую 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}"
            }
        }
    }
}

Хороший! android-maven-publish, упомянутый на его сайте, больше не нужен, если в вашем проекте используется AGP (Android Gradle Plugin) 3.6.0 или новее, поскольку он уже поддерживает maven-publish.

htafoya 15.10.2020 22:54

Плагин 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

Другие вопросы по теме