Gradle includeBuild与implementation project的区别

28
在Gradle构建系统中,includeBuild(...)implementation(project(...))的主要区别是什么?阅读文档后我无法真正看出用例差异。
  1. https://docs.gradle.org/current/userguide/declaring_dependencies.html#sub:project_dependencies
  2. https://docs.gradle.org/current/userguide/composite_builds.html#separate_composite
我要做的是:为两个独立项目共享相同的代码库:数据类(kotlinx.serialization)、外部数据库dao和接口。这不是一个完整的库,只是一些代码片段。
如何在Intellij中连接这两个项目,以便类型提示正常工作?

对我来说,implementation(project(...)) 更好。每个常用组件就像第三方库一样,使依赖图更有组织性。 - chehsunliu
2个回答

35

Composite Build(使用includeBuild)是一种方式,可以在独立Gradle项目之间创建依赖关系。
Project import是一种在同一Gradle项目中的两个模块之间创建依赖关系的方法。

Composite Build功能更为强大,并且也是用于将gradle配置在多个项目之间分解为新方式,传统上使用buildSrc技术进行此操作。我发现这篇“结构化大型项目”文章比“组合构建”文档更易于阅读。

您可以在Gradle sample_structuring_software_projects中找到演示Composite Build强大功能的优秀样例项目。

项目依赖案例

树形结构如下:

settings.gradle.kts
module1/build.gradle.kts
module2/build.gradle.kts

你正在module1/build.gradle.kts中声明一个依赖项,像这样:

dependencies {
   implementation(project("com.domain:module2"))
}

只有当这两个项目都被声明为共同根项目的子模块时,依赖关系才会被解决。

这意味着你有一个像这样的根settings.gradle.kts

rootProject.name = "rootProject"
include(":module1")
include(":module2")

组合构建案例

项目不需要有共同的“伞形”根项目。每个项目都是完全独立的项目。

一个项目可以简单地声明对另一个项目的依赖(甚至目标项目都不知道它)。

树形结构:

project1/build.gradle.kts
project1/settings.gradle.kts
project2/build.gradle.kts
project2/settings.gradle.kts

project1/settings.gradle.kts 中:

rootProject.name = "project1"
includeBuild("../project2") //No more ':' as it is not a module

project2/settings.gradle.kts中:

rootProject.name = "project2"
project1/build.gradle.kts 中,就像这样:
dependencies {
   implementation("com.domain:project2")
}

11
你引用了以com.domain:为前缀的project2项目。这个前缀是从哪里获取的? - caeus
1
“Composite build case/build.gradle.kts/implementation” 部分存在错误。正确的写法是:dependencies{ implementation("com.domain:project2") } 。@AlejandroNavas,在给定的示例中,implementation 参数必须遵守依赖关系符号模式 group:name:version,例如:com.domain:project2,因为版本为空。 - rojarand
我相信它当时是正常工作的,但我不确定。如果您可以指出有关project正确使用的Gradle文档,那就太好了,我找不到它。 - Renaud
依赖项 { implementation("com.domain:project2") } 是正确的。同时需要 includeBuild("../project2"),假设 project1 和 project2 在同一个文件夹中。 - craig.tadlock

1
我有同样的问题。在第一个链接中阅读,下一段说:
本地模块依赖项的分支
如果模块本身是使用Gradle构建的,则可以通过依赖于该模块源代码的本地分支来替换模块依赖项。这可以通过利用组合构建来实现。例如,您可以通过使用和构建本地修补版本而不是已发布的二进制版本来修复应用程序中使用的库中的问题。有关详细信息,请参见组合构建部分。
所以,按照我的理解,应该是implementation project。
附言:代码完成在我的一个子项目上正在工作,但在另一个子项目上却没有。我仍在努力解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接