build.gradle.kts & 多模块项目:如何添加其他项目以便传递依赖项也可用

build.gradle.kts & multi-module-project: how to add other project so that transitive dependencies are available too

具有以下多模块设置:

multi
├── projA
│   └── build.gradle.kts
├── projB
│   └── build.gradle.kts
├── build.gradle.kts
└── settings.gradle.kts

内容如下(略):

为什么我无法访问来自 projBimportantlibrary:1.0

有效方法:如果我在 projA 中有一个使用该库的 class,即使 class 是从 class 中调用的,它也能完美运行=19=](因此间接访问有效)。在 projB 中直接访问来自 importantlibrary:1.0 的任何 class 都不起作用(未解决的引用)。

我在这里错过了什么?或者需要设置什么才能正常工作?

Gradle版本:5.6.1

我发现很多来源都提到 configuration 来处理传递依赖项的处理方式。深入挖掘,我发现默认配置应该使 runtimeruntimeOnlyimplementation 可用于引用项目。

要么我在这里误解了 "default",要么您确实需要明确地使用 "default" 配置来调用它。在 projB 中如下声明依赖关系,使 projA 的依赖关系也可用于 projB

implementation(project(":projA", "default"))
// or with named parameters:
implementation(project(path = ":projA", configuration = "default"))

想知道这个 is/was 是否真的有意为之,或者这是否是 project 函数的 configuration 参数的一个不幸的默认值。

我认为实现您想要的效果的一个好方法是使用 api 而不是 implementationimplementation 意味着仅将依赖项保留在模块内,而 api 意味着将它们与模块一起导出。 projA 的依赖项将变为:

dependencies {
    api("important-library:1.0")
}

这是官方文档的link:https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation

有 2 个主题:依赖关系的传递性和 /src 作为依赖关系

  • 依赖传递性

我们使用api以便可以将依赖项导出到更高层次的模块。

build.gradle.kts (:library_base)

dependencies {
    api("group", "name", "version")
}

build.gradle.kts(:普通)

dependencies {
    implementation(project(":domain"))
    implementation(project(":library_base"))
}
  • /src 作为依赖项的传递性

我们在第二个参数中传递 "default" 作为配置,以便能够从模块的较低层级导入 /src

build.gradle.kts (:feature_a)

dependencies {
    implementation(project(":common", "default"))
}

能够从 :feature_a/src 访问,例如。 :domain 我们使用 "default" 作为配置并能够访问 :library_base 的依赖项,我们确保它们在该模块中使用 api 定义,以便它们可以导出.

GL

Source