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

build.gradle.kts&;多模块项目:如何添加其他项目以使可传递的依赖项也可用,gradle,gradle-kotlin-dsl,Gradle,Gradle Kotlin Dsl,具有以下多模块设置: multi ├── projA │ └── build.gradle.kts ├── projB │ └── build.gradle.kts ├── build.gradle.kts └── settings.gradle.kts 包含以下内容(缩写): settings.gradle.kts rootProject.name = "multi" include("projA", "projB") dependencies { implementat

具有以下多模块设置:

multi
├── projA
│   └── build.gradle.kts
├── projB
│   └── build.gradle.kts
├── build.gradle.kts
└── settings.gradle.kts
包含以下内容(缩写):

  • settings.gradle.kts

    rootProject.name = "multi"
    include("projA", "projB")
    
    dependencies {
        implementation("important-library:1.0")
    }
    
    dependencies {
        implementation(project(":projA"))
    }
    
  • projA\build.gradle.kts

    rootProject.name = "multi"
    include("projA", "projB")
    
    dependencies {
        implementation("important-library:1.0")
    }
    
    dependencies {
        implementation(project(":projA"))
    }
    
  • projB\build.gradle.kts

    rootProject.name = "multi"
    include("projA", "projB")
    
    dependencies {
        implementation("important-library:1.0")
    }
    
    dependencies {
        implementation(project(":projA"))
    }
    
为什么我不能从
projB
访问该
重要库:1.0

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

我错过了什么?或者需要设置什么才能使其工作


Gradle版本:5.6.1

我发现很多资料都提到了
配置
来处理可传递依赖关系。深入挖掘,我发现默认配置应该使
运行时
仅运行时
实现
可用于引用项目

要么我在这里误解了“default”,要么你真的需要使用
“default”
-配置显式地调用它。在
projB
中声明依赖项如下,使得
projA
中的依赖项也可用于
projB

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

想知道这是否是/确实是有意的,或者这是否是
项目
-函数的
配置
-参数的一个不幸的默认值。

我认为实现您想要的功能的一个好方法是使用
api
而不是
实现
<代码>实现意味着仅将依赖项保留在模块内部,而
api
意味着将它们与模块一起导出。
projA
的依赖关系将变成:

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

这是官方文档的链接:

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

  • 依赖传递性
我们使用
api
,以便将依赖项导出到更高层次的模块中

build.gradle.kts(:library\u base)
build.gradle.kts(:common)
  • /src作为依赖项的传递性
我们将第二个参数中的
“default”
作为配置传递,以便能够从较低的模块层次结构导入
/src

build.gradle.kts(:feature_a) 为了能够从
:feature_a
访问
/src
,例如
:domain
,我们使用
“default”
作为配置,并且能够访问
:library\u base
的依赖项,我们确保在该模块中使用
api
定义它们,以便可以导出它们

德国劳埃德船级社


你能再详细说明一下吗?我的意思是,这当然适用于讨论中的类,但下一步将是构建一个胖罐子。。。然后应该包括哪些依赖项,哪些不应该?你将如何解决这个问题?来自Maven,我认为
compile
可以用
implementation
替换,而
可以用
api
替换。。。而且它几乎成功了。。。
configuration=“default”
解决了上一个问题,现在它的工作方式似乎与Maven中的工作方式类似……但是,如果我的假设是错误的,那么我洗耳恭听,它实际上应该是什么样的,以及我将如何解决类似于胖罐子的问题……似乎我的假设是不正确的。。。需要更多研究:-)将清理一些评论。。。