Gradle uploadArchives 工件命名空间依赖于插件

Gradle uploadArchives artifacts namespace when depending on a plugin

我用 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 任务取决于 uploadArchives

updateVersion.dependsOn uploadArchives

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

我怀疑,也许,因为我将 uploadArchives 任务添加为发布插件任务的依赖项,所以 "namespace" 是不同的,所以基本上 uploadArchives 任务不使用 "same instance" 的 artifacts.archives,在构建期间填充。

updateVersion.dependsOn uploadArchives

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