我有一个使用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)

为了实现这一点,我要做的就是根据上载的存档来执行gradle-release插件的updateVersion任务
updateVersion.dependsOn uploadArchives

好吧,当我这样做时,artifacts.archives。为空,因此没有上载。

我怀疑,也许是因为我添加了uploadArchives任务作为发布插件任务的依赖项,所以“命名空间”不同,因此,基本上,uploadArchives任务不使用artifacts.archives的“相同实例”,构建。

最佳答案



如果这样做,那么最终您将在发布完成的相同过程中调用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)

08-16 18:49