【问题标题】:Gradle: Condition base publishing package on maven repositoryGradle:maven 存储库上的条件基础发布包
【发布时间】:2018-05-10 09:49:10
【问题描述】:

我有一个 gradle 文件,用于构建 JAR 并将其发布到 nexus 服务器上的 maven 存储库中。

build.gradle文件

publishing {
    publications {
        maven(MavenPublication) {
            artifact shadowJar
        }
    }
    repositories {
        maven {
            credentials {
                username nexusUsername
                password nexusPassword
            }
            if (IsSnapshot.toBoolean())
                url "${nexusUrl}/repository/maven-snapshots/"
            else
                url "${nexusUrl}/repository/maven-releases/"
        }
    }
}

此任务根据IsSnapshot 的值将 JAR 文件发布到相应的存储库(快照/发布)。

我还有一个变量:DoPublish。如果DoPublishtrue,那么我要发布包;否则,我不想在 nexus 上发布包。

我想在这种情况下我应该将url 设置为一个空字符串。有没有更好的建议?

gradle 任务的输出

发布任务

generatePomFileFor{module1}Publication - 为发布“module1”生成 Maven POM 文件。

generatePomFileFor{module2}Publication - 为发布“module2”生成 Maven POM 文件。

generatePomFileForMavenPublication - 为发布“maven”生成 Maven POM 文件。

publish - 发布此项目制作的所有出版物。

publish{module1}PublicationToMavenLocal - 将 Maven 发布“module1”发布到本地 Maven 存储库。

publish{module1}PublicationToMavenRepository - 将 Maven 发布“module1”发布到 Maven 存储库“maven”。

publish{module2}PublicationToMavenLocal - 将 Maven 发布“module2”发布到本地 Maven 存储库。

publish{module2}PublicationToMavenRepository - 将 Maven 发布“module2”发布到 Maven 存储库“maven”。

publishMavenPublicationToMavenLocal - 将 Maven 发布“maven”发布到本地 Maven 存储库。

publishMavenPublicationToMavenRepository - 将 Maven 出版物“maven”发布到 Maven 存储库“maven”。

publishToMavenLocal - 将此项目生成的所有 Maven 发布发布到本地 Maven 缓存。

【问题讨论】:

标签: java maven gradle build.gradle


【解决方案1】:

可以使用 onlyIf 有条件地停用任务,如 gradle 文档中所述:https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:using_a_predicate

这里有问题的任务是publishMavenJavaPublicationToMavenRepository,正如这里描述的https://docs.gradle.org/current/userguide/publishing_maven.html,这是需要禁用的任务:

publishMavenJavaPublicationToMavenRepository.onlyIf { IsSnapshot.toBoolean() }

因为任务publishMavenJavaPublicationToMavenRepository 是在成功发布配置时动态生成的,所以在解析和评估构建脚本时它可能不可用,从而导致异常。在这种情况下,可以在完成任务 gragh 后对其进行更新:

gradle.taskGraph.whenReady { graph -> 
  publishMavenJavaPublicationToMavenRepository.onlyIf { IsSnapshot.toBoolean() }
}

如果你使用不同的发布插件,这可能是一个不同的任务,但想法是一样的

【讨论】:

  • 感谢您的回答,我会在几天内检查并标记为答案。
  • 我在添加“publishMavenPublicationToMavenRepository.onlyIf { false }”时遇到异常 执行模型规则时抛出异常:PublishingPlugin.Rules#publishing(ExtensionContainer) 无法获取类型对象的未知属性 'publishMavenPublicationToMavenRepository' org.gradle.api.publish.internal.DefaultPublishingExtension.
  • 我尝试查阅文档以获取 publish 插件定义的任务名称。显然这是不同的东西。运行./gradlew tasks 以找出publish 定义的任务并在那里应用相同的技术。正如最后一句话所说:这可能是一项不同的任务,但想法是一样的。文档说:The created task is named “publish«PUBNAME»PublicationTo«REPONAME»Repository”
  • 我尝试了 gradle task 命令并且“publishMavenPublicationToMavenRepository”是有效的任务名称。我已添加有问题的发布任务列表
  • 棘手。该任务可能是在应用插件时或插件规范完成时动态生成的。您可以尝试在配置评估的回调中使用上述逻辑:gradle.taskGraph.whenReady { graph -> publishMavenJavaPublicationToMavenRepository.onlyIf { IsSnapshot.toBoolean() } }IMO 有问题的特定插件非常糟糕,但显然对您的情况没有帮助
猜你喜欢
  • 2019-08-02
  • 1970-01-01
  • 2011-11-10
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多