2014-10-26 589 views
4

我试图创建一个基于gradle的多模块项目。还有一个项目包含不同的gradle脚本,支持可插入的构建配置。其中一种脚本是将工件发布到Maven存储库。这是该脚本的内容:Gradle的publishToMavenLocal任务没有被正确执行

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任务是最新的,我无法在本地资源库中找到工件。难道我做错了什么?

+0

也许检查--info和--debug日志。 – 2014-10-26 21:25:53

+0

:food-orders-online-admin-business:publishToMavenLocal(Thread [main,5,main])sta rted。 :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])com pleted。花了0.007秒。 – 2014-10-26 21:51:08

+0

我已经知道该任务被跳过。我的问题是为什么。我认为subprojects.findAll()不会返回任何东西。那么我怎样才能访问所有的子项目?我可以分别在每个项目中做到这一点,但如果我能做到这一点,它就是重复和愚蠢的。 – 2014-10-26 21:52:52

回答

3

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

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

我发现的具体情况发生在多模块设置中,具有多级嵌套模块。它可以概括如下,其中共享:域失去当被

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 

他们依赖我创建了一个小例子项目展示在这里这种行为提供其publishMavenJavaPublicationToMavenLocal - 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. 取下上的共享的依赖:域
  2. 使一个子模块与其父模块装配文件中指定其配置
  3. 给共享:域自身的gradle这个build文件
+0

非常感谢您提供这样详尽且解释清楚的答案。我想我会在我的情况下采取第三种解决方法。我也希望Gradle团队很快就能解决这个问题。 – 2015-01-08 16:37:48

+0

考虑到我花了多长时间跟踪这个错误,我很高兴能够与某人分享解决方法。 – PiersyP 2015-01-08 17:45:59

+1

也许你应该在[问题跟踪器](https://issues.gradle.org/browse/GRADLE)而不是论坛上提出它。 – 2015-01-18 23:08:25

1

通过从here适应的答案,它为我工作。

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