【问题标题】:Android gradle uploadArchives when building构建时的Android gradle uploadArchives
【发布时间】:2016-04-01 11:28:54
【问题描述】:

我有我的 uploadArhives 到 Maven 存储库 .aar 发布。

但我必须一直从控制台运行gradlew uploadArhives,如何编写代码使其在每次构建或发布构建时调用?

uploadArchives {
    repositories {
        mavenDeployer {
            def credentials = [
                    userName: NEXUS_USERNAME,
                    password: NEXUS_PASSWORD
            ]
            repository(url: MAVEN_REPO_URL, authentication: credentials)
            pom.artifactId = 'aaa'
            pom.version = version
            pom.packaging = 'aar'
            pom.groupId = 'bbb'

        }
    }
}

编辑

我想,我们可以定义函数:

def uploadToMaven = {
    uploadArchives
}

但是如何在每次构建时执行它呢?

【问题讨论】:

  • 您是否考虑过创建 travis.ci 或其他类型的构建自动化脚本(.sh 文件)?当然 gradlew 或其他终端工具可以选择构建应用程序。从那里开始,每次您想要执行这些操作时都运行构建脚本一样简单。

标签: android maven gradle android-gradle-plugin


【解决方案1】:

我有一个包含许多模块和一个主要应用程序的复杂项目。 我在其中两个模块上添加了“uploadArchives”(因为是 android 库)。通过这种方式,我可以在 Maven 上发布我的库,只需从我的主应用程序运行任务 uploadArchives,或者使用 gradle 并调用此任务“uploadArchives”。

您可以在您的 build.gradle(您要发布的库的)“build.finalizedBy(uploadArchives)”中使用它。

例如:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 2
        versionName "2.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    lintOptions {
        abortOnError false
    }


}


build.finalizedBy(uploadArchives)

task wrapper(type: Wrapper) {
    gradleVersion = "2.8"
}

dependencies {
    compile project(':spfshared')
    compile 'com.google.code.gson:gson:2.4'
}

//task for Sonatype Nexus OSS
uploadArchives {
    repositories {
        mavenDeployer {
            repository(
                    url: "${nexusUrl}/content/repositories/releases") {
                authentication(userName: nexusUsername, password: nexusPassword)
            }
            snapshotRepository(
                    url: "${nexusUrl}/content/repositories/snapshots") {
                authentication(userName: nexusUsername, password: nexusPassword)
            }

            pom.version = "2.0.0.1"
            pom.artifactId = "spflib"
            pom.groupId = "it.polimi.spf"
        }
    }
}

每次构建后,uploadArchives 都会启动。

我尝试了这个解决方案,它确实有效。

我还尝试了一些使用“build.dependsOn myTaskName”的解决方案,但没有成功。如果你愿意,你可以尝试,但在我的 AndroidStudio 上,它的第一个解决方案是有效的。

PS:我使用命令“gradlew -q build”测试了我的解决方案,并且还专门从 Android Studio 的主模块运行了任务“build”(它是我的主应用程序)。

如果您想在每次发布时调用“uploadArchives”,只需将“build”替换为发布任务即可。

更新: 我也尝试了这些代码行:

defaultTasks 'uploadArchives'

clean.finalizedBy(uploadArchives)
assembleDebug.finalizedBy(uploadArchives)
assembleRelease.finalizedBy(uploadArchives)

但有时他们多次调用“uploadArchives”,我认为这不是一个好主意。

你的问题很有挑战性……我试了整整一个小时:)

【讨论】:

  • 是的,这很好用!但是当我输入“gradlew -q build”时它正在工作。如何在每个构建中上传工件?当我按下构建或运行按钮时?
  • 所以gradlew -q build 值得输入'gradlew uploadArhives'
  • 是的,这个更新代码真的有效,谢谢!如果您与文档共享链接也将很棒,因为我很难找到它。
  • 谢谢你。对不起,我没有使用带有文档的网站来做到这一点。我随机尝试了很多次XD为此我说:“这不是一个好主意”,因为它不是官方的解决方案。
【解决方案2】:

只需将此行添加到您的 build.gradle:

build.finalizedBy(uploadArchives)

这会在构建任务和uploadArchives 任务之间创建任务依赖关系,这样每次构建成功执行时都会自动调用uploadArchives。

【讨论】:

  • 放在哪里呢?我在afterEvaluate { project -> 试过,但没有帮助
  • 试着把它放在你的 build.gradle 的根目录?
  • 我试图将它放在 gradle 文件中的任何地方,也可以放在根目录中。
  • 我忽略了您要求的 android 项目。您的 uploadArchives 任务是否在您的根 build.gradle 中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2012-11-27
相关资源
最近更新 更多