build.gradle.kts & multi-module-project:如何添加其他项目,以便传递依赖项也可用



具有以下多模块设置:

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

包含以下内容(简称(:

  • settings.gradle.kts

    rootProject.name = "multi"
    include("projA", "projB")
    
  • projAbuild.gradle.kts

    dependencies {
    implementation("important-library:1.0")
    }
    
  • projBbuild.gradle.kts

    dependencies {
    implementation(project(":projA"))
    }
    

为什么我无法访问projBimportantlibrary:1.0

什么有效:如果我在projA中有一个使用该库的类,即使该类是从projB中的类调用的,它也能完美运行(因此间接访问有效(。从projB中的importantlibrary:1.0直接访问任何类都不起作用(未解析的引用(。

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

格拉德尔版本:5.6.1

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

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

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

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

要么我在这里误解了"默认",要么你真的需要使用"default"-configuration 显式调用它。在projB中按如下方式声明依赖关系,使projA的依赖关系也可供projB使用:

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

想知道这是否真的是/是有意的,或者这是否是project函数的configuration参数的

不幸默认值。

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

  • 依赖关系传递性

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

build.gradle.kts (:library_base(

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

build.gradle.kts (:common(

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

最新更新