我有一个使用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)在运行时无法使用更改后的项目版本)
如果要在与构建相同的过程中执行任务,则需要使用beforeReleaseBuild
或afterReleaseBuild
依赖的任务。它们都在同一过程中运行。
所以在你的情况下
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)