我正在尝试使用多个依赖项来配置兄弟项目(我说的是项目依赖项,而不是工件依赖项)
所以结构类似于:
A (needs B)
B (needs C)
C
我需要正确设置这些依赖项。特别是,我正在使用Eclipse集成,因此目标是让Gradle -> Refresh all
在相关Eclipse项目中设置正确的依赖项(但是,我相信这个问题独立于Eclipse)。
请注意,只有逻辑层次结构布局,而不是物理布局(并且它将保持这种方式)。
我已经阅读了includeFlat
的用法,但可能我仍然遗漏了一些东西。
如果我们只查看B
和C
,那么我可以通过以下方式让它们正常工作:
B/settings.gradle
:includeFlat 'C'
B/build.gradle
:compile project(':C')
这适用于B
。
现在,A
需要B
。所以我的想法是:我只需要在A
和B
之间做同样的事情:
A/settings.gradle
:includeFlat 'B'
A/build.gradle
:compile project(':B')
我确实希望在刷新A
时,传递依赖关系A -> B -> C
会起作用,但在某个地方它会中断并且我得到:
Project with path ':C' could not be found in project ':B'
我猜测的是B/settings.gradle
没有被阅读。这是为什么?
有人能告诉我我不理解的事吗?
答案 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
}