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
内容如下(略):
settings.gradle.kts
rootProject.name = "multi"
include("projA", "projB")
projA\build.gradle.kts
dependencies {
implementation("important-library:1.0")
}
projB\build.gradle.kts
dependencies {
implementation(project(":projA"))
}
为什么我无法访问来自 projB
的 importantlibrary:1.0
?
有效方法:如果我在 projA
中有一个使用该库的 class,即使 class 是从 class 中调用的,它也能完美运行=19=](因此间接访问有效)。在 projB
中直接访问来自 importantlibrary:1.0
的任何 class 都不起作用(未解决的引用)。
我在这里错过了什么?或者需要设置什么才能正常工作?
Gradle版本:5.6.1
我发现很多来源都提到 configuration
来处理传递依赖项的处理方式。深入挖掘,我发现默认配置应该使 runtime
、runtimeOnly
和 implementation
可用于引用项目。
要么我在这里误解了 "default",要么您确实需要明确地使用 "default"
配置来调用它。在 projB
中如下声明依赖关系,使 projA
的依赖关系也可用于 projB
:
implementation(project(":projA", "default"))
// or with named parameters:
implementation(project(path = ":projA", configuration = "default"))
想知道这个 is/was 是否真的有意为之,或者这是否是 project
函数的 configuration
参数的一个不幸的默认值。
我认为实现您想要的效果的一个好方法是使用 api
而不是 implementation
。 implementation
意味着仅将依赖项保留在模块内,而 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
具有以下多模块设置:
multi
├── projA
│ └── build.gradle.kts
├── projB
│ └── build.gradle.kts
├── build.gradle.kts
└── settings.gradle.kts
内容如下(略):
settings.gradle.kts
rootProject.name = "multi" include("projA", "projB")
projA\build.gradle.kts
dependencies { implementation("important-library:1.0") }
projB\build.gradle.kts
dependencies { implementation(project(":projA")) }
为什么我无法访问来自 projB
的 importantlibrary:1.0
?
有效方法:如果我在 projA
中有一个使用该库的 class,即使 class 是从 class 中调用的,它也能完美运行=19=](因此间接访问有效)。在 projB
中直接访问来自 importantlibrary:1.0
的任何 class 都不起作用(未解决的引用)。
我在这里错过了什么?或者需要设置什么才能正常工作?
Gradle版本:5.6.1
我发现很多来源都提到 configuration
来处理传递依赖项的处理方式。深入挖掘,我发现默认配置应该使 runtime
、runtimeOnly
和 implementation
可用于引用项目。
要么我在这里误解了 "default",要么您确实需要明确地使用 "default"
配置来调用它。在 projB
中如下声明依赖关系,使 projA
的依赖关系也可用于 projB
:
implementation(project(":projA", "default"))
// or with named parameters:
implementation(project(path = ":projA", configuration = "default"))
想知道这个 is/was 是否真的有意为之,或者这是否是 project
函数的 configuration
参数的一个不幸的默认值。
我认为实现您想要的效果的一个好方法是使用 api
而不是 implementation
。 implementation
意味着仅将依赖项保留在模块内,而 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