如何使用 `com.gradle.plugin-publish` 插件发布自定义工件?
How to publish custom artifacts with `com.gradle.plugin-publish` plugin?
我正在尝试使用 ProGuard 来最小化我的 gradle 插件,它运行良好,生成了输出文件 a-min.jar
然而,com.gradle.plugin-publish
插件在使用任务 publishPlugins
时无法识别它,它告诉
Cannot determine main artifact to upload - could not find jar artifact with empty classifier
奇怪的是,在使用 publishToMavenLocal
时效果很好。
我尝试了一些技巧来用我处理过的 jar 替换主 jar,但总是失败。这里有什么新景象吗?
afterEvaluate {
publishing {
publications {
withType<MavenPublication> {
if (name == "pluginMaven") {
setArtifacts(listOf(
artifact(minJarPath){
classifier = ""
extension = "jar"
}
))
}
}
}
}
}
我已经尝试反编译 com.gradle.plugin-publish:0.18.0
,得到
private File findMainArtifact() {
if (this.useAutomatedPublishing) {
for (UsageContext variant : this.javaRuntimeVariants) {
for (PublishArtifact artifact : variant.getArtifacts()) {
if (Util.isBlank(artifact.getClassifier()) && "jar".equals(artifact.getExtension()))
return artifact.getFile();
}
}
} else {
Configuration archivesConfiguration = getProject().getConfigurations().getByName("archives");
for (PublishArtifact artifact : archivesConfiguration.getAllArtifacts()) {
if (Util.isBlank(artifact.getClassifier()) && "jar".equals(artifact.getExtension()))
return artifact.getFile();
}
}
throw new IllegalArgumentException("Cannot determine main artifact to upload - could not find jar artifact with empty classifier");
}
但我不知道如何将工件添加到“AllArtifacts”。
通过一些技巧解决,虽然不够优雅。
解决方案
- 创建一个真正的 jar 任务以包含 proguard 输出并将其添加到 apiElements 和 runtimeElements 的输出。
从 apiElements & runtimeElements 中删除未处理的 jar。 (对于 publishPlugins
任务)
- 此外,修改出版物(针对
publishToMavenLocal
任务)
例子
/* Written in Kotlin DSL for Gradle */
/* build.gradle.kts */
// for `publishPlugins` task
val minJar by tasks.creating(Jar::class){
dependsOn(genMinJar)
from(zipTree(minJarPath))
}
jar {
archiveClassifier.set("unpacked")
}
configurations {
artifacts {
arrayOf(apiElements, runtimeElements).forEach {
it.get().outgoing.artifacts.removeIf { it.classifier == "unpacked" }
it.get().outgoing.artifact(minJar)
}
}
}
// for `publishToMavenLocal` task
afterEvaluate {
publishing {
publications {
withType<MavenPublication> {
if (name == "pluginMaven") {
setArtifacts(listOf(minJar))
}
}
}
}
}
详情
见https://github.com/ArcticLampyrid/gradle-git-version/commit/23ccfc8bdf16c9352024dc0b7722f534a310551f
我正在尝试使用 ProGuard 来最小化我的 gradle 插件,它运行良好,生成了输出文件 a-min.jar
然而,com.gradle.plugin-publish
插件在使用任务 publishPlugins
时无法识别它,它告诉
Cannot determine main artifact to upload - could not find jar artifact with empty classifier
奇怪的是,在使用 publishToMavenLocal
时效果很好。
我尝试了一些技巧来用我处理过的 jar 替换主 jar,但总是失败。这里有什么新景象吗?
afterEvaluate {
publishing {
publications {
withType<MavenPublication> {
if (name == "pluginMaven") {
setArtifacts(listOf(
artifact(minJarPath){
classifier = ""
extension = "jar"
}
))
}
}
}
}
}
我已经尝试反编译 com.gradle.plugin-publish:0.18.0
,得到
private File findMainArtifact() {
if (this.useAutomatedPublishing) {
for (UsageContext variant : this.javaRuntimeVariants) {
for (PublishArtifact artifact : variant.getArtifacts()) {
if (Util.isBlank(artifact.getClassifier()) && "jar".equals(artifact.getExtension()))
return artifact.getFile();
}
}
} else {
Configuration archivesConfiguration = getProject().getConfigurations().getByName("archives");
for (PublishArtifact artifact : archivesConfiguration.getAllArtifacts()) {
if (Util.isBlank(artifact.getClassifier()) && "jar".equals(artifact.getExtension()))
return artifact.getFile();
}
}
throw new IllegalArgumentException("Cannot determine main artifact to upload - could not find jar artifact with empty classifier");
}
但我不知道如何将工件添加到“AllArtifacts”。
通过一些技巧解决,虽然不够优雅。
解决方案
- 创建一个真正的 jar 任务以包含 proguard 输出并将其添加到 apiElements 和 runtimeElements 的输出。
从 apiElements & runtimeElements 中删除未处理的 jar。 (对于publishPlugins
任务) - 此外,修改出版物(针对
publishToMavenLocal
任务)
例子
/* Written in Kotlin DSL for Gradle */
/* build.gradle.kts */
// for `publishPlugins` task
val minJar by tasks.creating(Jar::class){
dependsOn(genMinJar)
from(zipTree(minJarPath))
}
jar {
archiveClassifier.set("unpacked")
}
configurations {
artifacts {
arrayOf(apiElements, runtimeElements).forEach {
it.get().outgoing.artifacts.removeIf { it.classifier == "unpacked" }
it.get().outgoing.artifact(minJar)
}
}
}
// for `publishToMavenLocal` task
afterEvaluate {
publishing {
publications {
withType<MavenPublication> {
if (name == "pluginMaven") {
setArtifacts(listOf(minJar))
}
}
}
}
}
详情
见https://github.com/ArcticLampyrid/gradle-git-version/commit/23ccfc8bdf16c9352024dc0b7722f534a310551f