簡體   English   中英

如何使用 Android Gradle 插件 3.0.0 將所有風味變體發布到 maven?

[英]How to publish all flavor variants to maven with Android Gradle plugin 3.0.0?

之前我用過android gradle plugin v2.2.2,現在我正在遷移到3.0。 下面的代碼將我的所有變體發布( uploadArchives任務)到 Maven,而 2.14.1 沒有任何問題。 但是一旦我升級到 3.0,就沒有發布任何內容。 如果我刪除prodcutFlavors ,它會將庫的發布版本正確發布到 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發布三種配置(對應於我的三種構建類型“調試”、“發布”和“暫存”)。 但它不再這樣做,它只向 Maven 發布一個 AAR 以用於“發布”配置。

在 Android Plugin for 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 for 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 項目我了解到有兩種 Gradle 機制可以發布到 Gradle。 此外,還有這些的非官方 Android 實現。

Maven 插件:每個項目有多個工件

我認為您正在使用的舊版本是因為您已指定apply plugin: 'maven'此處記錄在The Maven Plugin 中 要獲得多個 AAR 文件輸出,大概您將“需要為要發布的每個工件聲明一個過濾器”。 但缺點是“您需要生成多個 POM”( 每個項目的多個工件)。

Maven 發布(新):發布多個模塊

Maven Plugin的明顯替代品是一個新的Maven Publishing (new) ,它似乎能夠發布多個工件,如發布多個模塊中所述 基本上,您似乎只需要在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 Libraries: 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}"
            }
        }
    }
}

正如htofoya所提到的,適用於 AndroidMaven Publish 插件確實可以做到這一點

您可以一一輸入所有變體,如文檔中所示,或者您可以執行以下操作:

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
        }
    }
}

Michael Osofsky回答中顯示的android-maven-publish示例存在缺陷,無法生成正確的 POM 文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM