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

时间:2019-08-29 12:06:25

标签: 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")
    
  • projA\build.gradle.kts

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

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

为什么我不能从importantlibrary:1.0访问那个projB

有效的方法:如果我在projA中有一个使用该库的类,那么即使从projB中的一个类调用了该类,它也可以很好地工作(因此间接访问有效)。无法直接从importantlibrary:1.0中的projB访问任何类(未解析的引用)。

我在这里想念什么?还是需要设置什么才能使其起作用?

版本版本:5.6.1

3 个答案:

答案 0 :(得分:2)

我认为实现您想要的目标的一种好方法是使用api而不是implementationimplementation意味着仅将依赖项保留在模块内部,而api则将其与模块一起导出。 projA的依赖项将变为:

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

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

答案 1 :(得分:1)

我发现有很多消息来源提到configuration来处理如何处理传递性依存关系。深入研究发现,默认配置应使runtimeruntimeOnlyimplementation可用于引用项目。

或者我在这里误解了“默认”,或者您确实需要使用"default"-配置显式调用它。在projB中声明依赖关系,使得projA的依赖关系也可用于projB

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

想知道这是否是真的,还是configuration函数的project参数的不幸默认值。

答案 2 :(得分:0)

有两个主题:依赖关系的传递性和/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

Source