【问题标题】:How to publish custom artifacts with `com.gradle.plugin-publish` plugin?如何使用 com.gradle.plugin-publish 插件发布自定义工件?
【发布时间】:2022-01-15 07:10:05
【问题描述】:

我正在尝试使用 ProGuard 最小化我的 gradle 插件,它运行良好,生成输出文件 a-min.jar

但是,com.gradle.plugin-publish 插件在使用任务publishPlugins 时无法识别它,它告诉

无法确定要上传的主要工件 - 找不到带有空分类器的 jar 工件

奇怪的是,当使用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

【问题讨论】:

    标签: java gradle gradle-plugin


    【解决方案1】:

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

    解决方案

    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

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      相关资源
      最近更新 更多