【问题标题】:Gradle's publishToMavenLocal task is not executed correctlyGradle 的 publishToMavenLocal 任务没有正确执行
【发布时间】:2014-10-26 20:31:57
【问题描述】:

我正在尝试创建一个基于 gradle 的多模块项目。还有一个项目包含不同的 gradle 脚本,这些脚本支持可插入的构建配置。其中一个脚本用于将工件发布到 Maven 存储库。这是该脚本的内容:

apply plugin: 'maven-publish'

configure(subprojects.findAll()) {
    if (it.name.endsWith('web')) {
        publishing {
            publications {
                mavenWeb(MavenPublication) {
                    from components.web
                }
            }
        }
    } else {
        publishing {
            publications {
                mavenJava(MavenPublication) {
                    from components.java
                }
            }
        }
    }
}

build.dependsOn publishToMavenLocal

此脚本包含在其他项目的构建 gradle 文件中。

apply from: '../../food-orders-online-main/artifact-publish.gradle'

当我运行构建任务时,它总是显示 publishToMavenLocal 任务是最新的,我无法在本地存储库中找到工件。我做错了吗?

【问题讨论】:

  • 也许检查 --info 和 --debug 日志。
  • :food-orders-online-admin-business:publishToMavenLocal (Thread[main,5,main]) 已启动。 :food-orders-online-admin-business:publishToMavenLocal 跳过任务 ':food-orders-online-admin-business:publishToMavenLocal' 因为它没有操作。 :food-orders-online-admin-business:publishToMavenLocal 最新 :food-orders-online-admin-business:publishToMavenLocal (Thread[main,5,main]) 已完成。耗时 0.007 秒。
  • 我已经知道任务被跳过了。我的问题是为什么。我认为 subprojects.findAll() 不会返回任何东西。那么如何访问所有子项目呢?我可以在每个项目中分别做,但如果我能做到,那就是重复和愚蠢。

标签: gradle publish artifacts multi-project


【解决方案1】:

通过改编 here 的答案,它对我有用。

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
    repositories {
        mavenLocal()
    }
}

【讨论】:

  • 是否需要mavenLocal() 位? @dkb 提供的链接指出:“您不需要在 publishing.repositories 部分中包含 mavenLocal()。”
  • @M.Justin repositories.mavenLocal 部分不是必需的。我的设置没有它,我的人工制品仍然会发布到我的本地 .m2
  • 这让我很开心。它对我有用。在各种帖子中建议了许多其他方法,但只有这对我有用。谢谢:)
【解决方案2】:

我认为这可能是 gradle 的一个错误的表现,即当以某种方式依赖模块时,它们可能会丢失 publishMavenJavaPublicationToMavenLocal 任务。

如果 gradle 确定一个模块没有 publishMavenJavaPublicationToMavenLocal 任务,那么 publishToMavenLocal 任务将始终报告它是最新的。

我发现的特定情况发生在多模块设置中,具有多级嵌套模块。可以总结如下,其中 shared:domain 在被 A 依赖时失去了它的 publishMavenJavaPublicationToMavenLocal

root
root gradle build file
->A
  own gradle build file with dependency on shared:domain
-> shared
    gradle build file for shared modules
     -> shared:domain
     -> shared:B

我创建了一个小示例项目来演示此行为 - https://github.com/piersy/Gradle2MavenPublishBug

我还在这里记录了一个 gradle 错误 - http://forums.gradle.org/gradle/topics/the-publishmavenjavapublicationtomavenlocal-task-disappears-from-a-project-when-that-project-is-depended-upon-in-a-specific-way

目前我发现的解决方法是

  1. 移除 A 对 shared:domain 的依赖
  2. 使 A 成为子模块,其配置在其父模块构建文件中指定
  3. 为 shared:domain 提供自己的 gradle 构建文件

【讨论】:

  • 感谢您提供如此详细且解释清楚的答案。我想我会采用第三种解决方法。我也希望 Gradle 团队能尽快解决这个问题。
  • 鉴于我花了多长时间才找到这个错误,我很高兴能够与某人分享解决方法。
  • 也许你应该在issue tracker 而不是在论坛上提出它。
  • 嗨 Mirko,我很乐意,但据我所知,提出问题的唯一方法是通过论坛,如果您知道其他方式,请提供我可以注册的链接将错误添加到问题跟踪器。谢谢
  • @Karl 您链接的页面上的文字显示“如果您想报告 Gradle 的问题,请使用 Discussion.gradle.org 创建一个“错误”帖子”,并且链接在我上面的帖子是针对这样一个错误报告的,我在大约 2 年前提交。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
相关资源
最近更新 更多