Android 库 - 使用 Gradle 将多个变体发布到本地 Maven 存储库

Posted

技术标签:

【中文标题】Android 库 - 使用 Gradle 将多个变体发布到本地 Maven 存储库【英文标题】:Android Library - Publish Multiple Variants to Local Maven Repository using Gradle 【发布时间】:2014-09-30 17:16:32 【问题描述】:

我正在使用 android Gradle 插件 0.13.2、Android Studio 0.8.11、Gradle 2.1 和 maven 插件。

我想通过一个命令(任务)将我的 Android 库的多个变体(风味 + 构建类型)安装到本地 Maven 存储库。

目前 Android Gradle 插件 0.13.2 允许我设置 publishNonDefault 标志以发布所有变体,但正如文档所述,它将使用与 Maven 存储库不兼容的分类器发布变体。

我现在的解决方法是使用 defaultPublishConfig "myVariant" 并针对我拥有的每个变体进行更改。

apply plugin: 'com.android.library'
apply plugin: 'maven'

android 
    defaultPublishConfig "myVariant"
    .
    .
    .



task installArchives(type: Upload) 
    repositories.mavenInstaller 
        configuration = configurations.getByName(Dependency.DEFAULT_CONFIGURATION)
        pom.groupId = "com.company"
        pom.artifactId = "mylibrary"
        pom.version = "1.0.0-myVariant"
    

我希望有一个任务可以将所有变体正确发布到本地 Maven 存储库。

【问题讨论】:

【参考方案1】:

为了解决这个问题,我必须为每个变体创建一个上传任务,并使它们相互依赖,并依赖于启动流程的主任务。

apply plugin: 'com.android.library'
apply plugin: 'maven'

android 
    .
    .
    .



// Master task that will publish all variants
def DefaultTask masterTask = project.tasks.create("installArchives", DefaultTask)

android.libraryVariants.all  variant ->
    variant.outputs.each  output ->

        // Configuration defines which artifacts will be published, create one configuration for each variant output (artifact)
        def Configuration variantConfiguration = project.configurations.create("$variant.nameArchives")
        project.artifacts.add(variantConfiguration.name, output.packageLibrary)

        // Create one Upload type task for each configuration
        def Upload variantTask = project.tasks.create("$variant.nameInstall", Upload)
        variantTask.configuration = variantConfiguration
        variantTask.repositories.mavenInstaller 
            pom.groupId = "com.yourcompany"
            pom.artifactId = "yourLibrary"
            pom.version = "1.0.0-$variant.name" //Give a different version for each variant
            pom.packaging = "aar"
        

        // Make all tasks depend on each other and on master task
        masterTask.dependsOn variantTask
        masterTask = variantTask
    

installArchives 任务会将所有变体发布到本地 Maven 存储库。

./gradlew installArchives

【讨论】:

不幸的是,没有为每个变体生成 pom.xml 文件。你知道怎么解决吗? @DmitryZaitsev 可能您没有为每个变体生成不同的配置。如果您使用相同的配置,它不会为所有变体生成一个 .pom。 您能否在回答中提供更多详细信息?我花了很长时间尝试谷歌搜索,但没有成功。 在这一行中: def Configuration variantConfiguration = project.configurations.create("$variant.nameArchives") 我正在为每个变体创建一个配置。确保你正在这样做。 如何为所有变体包含源 jar 和 javadoc jar?

以上是关于Android 库 - 使用 Gradle 将多个变体发布到本地 Maven 存储库的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio gradle配置项 packagingOptions说明 Android打包so库重复问题

Android Studio gradle配置项 packagingOptions说明 Android打包so库重复问题

无法将 git 存储库解析为 android gradle 中的依赖项

如何建立与 Android studio和 gradle android 库

使用 Gradle 构建 Android AAR

Android Eclipse 导入 AS Gradle AAR 库手册