1

我有一个使用 Gradle 构建的 Android 应用程序。我正在使用gradle-release插件创建自动发布,然后使用 Gradle 的 uploadArchives 任务将生成的 .apk 上传到 Maven 存储库(Nexus)。

我必须添加档案以在运行时动态上传,因为我的构建使用的是自定义 Android 风格。当我从命令行运行 uploadArchives 时,一切正常:

variant.outputs.each { output ->
    def apkFile = output.outputFile

    tasks."assemble${capitalizedVariantName}" << {
        artifacts.archives [file: apkFile, classifier: variant.baseName]
    }
}

uploadArchives {
    repositories {
        mavenDeployer {
            pom.groupId = PROJECT_GROUP
            pom.artifactId = PROJECT_NAME
        }
    }
}

然后我运行:

./gradlew assembleFlavorNameRelease uploadArchives

并且 .apk 已正确上传到 Nexus。

在发布插件自动更改项目的版本名称并提交之前,我需要运行 uploadArchives 任务。基本上:

- current version: 0.1.0-SNAPSHOT
- run release
- version becomes: 0.1.0
- build (build task)
- upload this build to Nexus (uploadArchives task)
- update the version to: 0.1.1-SNAPSHOT (updateVersion task)

为了实现这一点,我所做的是根据 uploadArchives 让 gradle-release 插件的 updateVersion 任务

updateVersion.dependsOn uploadArchives

好吧,当我这样做时,artifacts.archives。是空的,所以没有上传。

我怀疑,也许,由于我将uploadArchives任务添加为发布插件任务的依赖项,那么“命名空间”是不同的,所以基本上uploadArchives任务不使用artifacts.archives的“相同实例”,填充期间构建。

4

1 回答 1

1

updateVersion.dependsOn 上传存档

如果你这样做,那么你最终会uploadArchives在发布完成时调用相同的过程,但不会在构建完成的同一过程中调用。为了让构建任务本身的版本正确,发布插件会产生一个新的 gradle 构建,它使用正确的版本号运行构建。(这样做是因为许多其他插件,如 maven-publish 无法在运行时获取更改的项目版本)

如果要在与构建相同的过程中执行任务,则需要使用任务beforeReleaseBuildafterReleaseBuild依赖。它们都在同一个进程中运行。

所以在你的情况下

afterReleaseBuild.dependsOn uploadArchives

uploadArchives在构建完成发布版本后直接运行。

为了更好地理解我调整了你的任务图:

- current version: 0.1.0-SNAPSHOT
- run release
- version becomes: 0.1.0 (and is written to gradle.properties)
- spawn new gradle build
    - build (build task)
    - upload this build to Nexus (uploadArchives task)
- update the version to: 0.1.1-SNAPSHOT (updateVersion task)
于 2015-10-15T10:28:16.933 回答