Gradle的publishToMavenLocal任务未正确执行

Rad*_*vic 4 publish artifacts multi-project gradle

我正在尝试创建一个基于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
Run Code Online (Sandbox Code Playgroud)

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

apply from: '../../food-orders-online-main/artifact-publish.gradle'
Run Code Online (Sandbox Code Playgroud)

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

小智 12

通过调整这里的答案,它适合我.

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
    repositories {
        mavenLocal()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是否需要 `mavenLocal()` 位?@dkb 提供的链接指出:“您不需要在“publishing.repositories”部分中包含“mavenLocal()”。” (2认同)
  • @M.Justin “repositories.mavenLocal” 部分不是必需的。我的设置没有它,我的工件仍然发布到我的本地“.m2”。 (2认同)

Pie*_*syP 6

我认为这可能是 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
Run Code Online (Sandbox Code Playgroud)

我创建了一个小示例项目,演示了此行为 - 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-以特定方式

目前我找到的解决方法是

  1. 删除A对shared:domain的依赖
  2. 将 A 设为子模块,其配置在其父模块构建文件中指定
  3. 为共享:域提供自己的 gradle 构建文件

  • 也许您应该在[问题跟踪器](https://issues.gradle.org/browse/GRADLE)而不是在论坛上提出它。 (2认同)