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 无法在 运行 时间内获取更改后的项目版本)
如果你想在与构建相同的进程中执行任务,你需要使用任务 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)
我用 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 无法在 运行 时间内获取更改后的项目版本)
如果你想在与构建相同的进程中执行任务,你需要使用任务 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)