如何使用 `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”。

完整代码:GitHub@ArcticLampyrid/gradle-git-version

通过一些技巧解决,虽然不够优雅。

解决方案

  1. 创建一个真正的 jar 任务以包含 proguard 输出并将其添加到 apiElements 和 runtimeElements 的输出。
    从 apiElements & runtimeElements 中删除未处理的 jar。 (对于 publishPlugins 任务)
  2. 此外,修改出版物(针对 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