考虑以下简单构建(settings.gradle.kts
):
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}
include("main-module")
include("specific-test-module")
字符串
主模块非常简单:
plugins {
id("java")
}
dependencies {
implementation("org.slf4j:slf4j-api:2.0.9")
}
型
我的目标是在specific-tests-module
中从testImplementation
范围内的main-module
继承implementation
依赖项。测试模块非常具体,因此我为它创建了一个单独的Gradle子项目。现在我正在尝试通过配置extendsFrom
来实现我的目标,但问题是,只要我尝试在单个Gradle子项目之外使用extendsFrom
,它就会停止工作。
虽然在main-module/build.gradle.kts
中添加新范围可以按预期工作:
configurations.create("someNewScope") {
extendsFrom(configurations.implementation.get()) // <--- 'someNewScope' will inherit 'slf4j-api'
}
型
尝试在另一个子项目中继承范围不会产生任何影响:
configurations.create("someScope") {
extendsFrom(project(":main-module").configurations.implementation.get())
}
型
在另一个子项目的依赖项尚未配置时,似乎过早尝试读取另一个子项目的配置。如何使作用域继承在不同的Gradle子项目之间工作?
1条答案
按热度按时间y4ekin9u1#
在Gradle项目之间共享内容的惯用方法和唯一推荐的方法是使用“变体”。下面是相应的文档部分:Producing and Consuming Variants of Libraries > Sharing outputs between projects。
它明确地说:
不直接引用其他项目任务
并提供了以下反模式示例:
字符串
与我最初尝试做的非常相似,但这是错误的。
在我的例子中,遵循文档中项目之间简单的工件共享部分,并通过像这样的“可消费”配置暴露依赖关系就足够了:
型
在此之后,我能够添加对项目的依赖并继承其暴露的配置,如下所示:
型
之所以有必要创建额外的配置,从第一眼来看,只有
extendsFrom
已经存在的配置,是因为您需要“可消耗”配置,使其对其他项目可见。这里的“可消耗”配置是在dependency {}
块中指定项目时,其他Gradle项目如何使用项目的一种 * 变体 *。在我的解决方案I中:
testImplementation(project(":main-module"))
隐式地使用了默认变量(以添加对main-module
的src/main
的依赖)main-module
的不同变体的依赖性,例如testImplementation(project(mapOf("path" to ":main-module", "configuration" to "exportedTestImplementation")))
(通过“可消耗”配置继承:main-module
的依赖性)其他参考文献: