Gradle - 兄弟和相互关联项目的配置

时间:2014-05-22 11:20:58

标签: eclipse gradle

我正在尝试使用多个依赖项来配置兄弟项目(我说的是项目依赖项,而不是工件依赖项)

所以结构类似于:

A (needs B)
B (needs C)
C 

我需要正确设置这些依赖项。特别是,我正在使用Eclipse集成,因此目标是让Gradle -> Refresh all在相关Eclipse项目中设置正确的依赖项(但是,我相信这个问题独立于Eclipse)。 请注意,只有逻辑层次结构布局,而不是物理布局(并且它将保持这种方式)。

我已经阅读了includeFlat的用法,但可能我仍然遗漏了一些东西。 如果我们只查看BC,那么我可以通过以下方式让它们正常工作:

  • B/settings.gradleincludeFlat 'C'
  • B/build.gradlecompile project(':C')

这适用于B

现在,A需要B。所以我的想法是:我只需要在AB之间做同样的事情:

  • A/settings.gradleincludeFlat 'B'
  • A/build.gradlecompile project(':B')

我确实希望在刷新A时,传递依赖关系A -> B -> C会起作用,但在某个地方它会中断并且我得到:

Project with path ':C' could not be found in project ':B'

我猜测的是B/settings.gradle没有被阅读。这是为什么? 有人能告诉我我不理解的事吗?

1 个答案:

答案 0 :(得分:2)

在Gradle多项目构建中,一次只能使用一个settings.gradle文件。由于项目B依赖于C而项目B是多项目构建的一部分,因此您需要在任何使用项目B的settings.gradle文件中包含项目C(假设您使用项目依赖项而不是工件依赖项)。

请注意,您可以告诉Gradle使用-c command line option为每个构建使用哪些settings.gradle文件,但除非包含B及其所有项目依赖项,否则A的构建将永远不会起作用。

另请注意,多项目构建始终定义单个“根”项目,该项目由settings.gradle文件的位置定义。因此,如果项目A包含settings.gradle,则它是“根”项目。但是,在平面布局中,您可以创建一个名为master的特殊目录来表示这一点,Gradle将自动在那里找到您的settings.gradle文件。 Read about this here.请注意,您的所有构建命令通常应该从“根”项目运行,因此如果您使用Gradle包装器,它应该存在于那里。

假设平面布局,我会建议这个结构:

A/
  build.gradle
  src/
    main/
      java/
B/
  build.gradle
  src/
    main/
      java/
C/
  build.gradle
  src/
    main/
      java/
master/
  build.gradle
  gradle/
    wrapper/
      gradle-wrapper.jar
      gradle-wrapper.properties
  gradlew
  gradlew.bat
  settings.gradle

settings.gradle的内容类似于:

["A", "B", "C"].each {
    includeFlat it
}