如何从不同的Gradle子项目继承依赖关系范围?

lnxxn5zx  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(148)

考虑以下简单构建(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子项目之间工作?

y4ekin9u

y4ekin9u1#

在Gradle项目之间共享内容的惯用方法和唯一推荐的方法是使用“变体”。下面是相应的文档部分:Producing and Consuming Variants of Libraries > Sharing outputs between projects
它明确地说:
不直接引用其他项目任务
并提供了以下反模式示例:

dependencies {
   // this is unsafe!
   implementation project(":other").tasks.someOtherJar
}

字符串
与我最初尝试做的非常相似,但这是错误的。
在我的例子中,遵循文档中项目之间简单的工件共享部分,并通过像这样的“可消费”配置暴露依赖关系就足够了:

val exportedCompileOnly by configurations.creating {
    isCanBeConsumed = true
    isCanBeResolved = false
    extendsFrom(configurations.compileOnly.get())
}

val exportedTestImplementation by configurations.creating {
    isCanBeConsumed = true
    isCanBeResolved = false
    extendsFrom(configurations.implementation.get())
}

val exportedTestRuntimeOnly by configurations.creating {
    isCanBeConsumed = true
    isCanBeResolved = false
    extendsFrom(configurations.runtimeOnly.get())
}


在此之后,我能够添加对项目的依赖并继承其暴露的配置,如下所示:

dependencies {
    testImplementation(project(":main-module"))
    testImplementation(project(mapOf("path" to ":main-module", "configuration" to "exportedTestImplementation")))
    testCompileOnly(project(mapOf("path" to ":main-module", "configuration" to "exportedCompileOnly")))
    testRuntimeOnly(project(mapOf("path" to ":main-module", "configuration" to "exportedTestRuntimeOnly")))
}


之所以有必要创建额外的配置,从第一眼来看,只有extendsFrom已经存在的配置,是因为您需要“可消耗”配置,使其对其他项目可见。这里的“可消耗”配置是在dependency {}块中指定项目时,其他Gradle项目如何使用项目的一种 * 变体 *。
在我的解决方案I中:

  • 通过将依赖声明为testImplementation(project(":main-module"))隐式地使用了默认变量(以添加对main-modulesrc/main的依赖)
  • 还通过显式指定变体名称添加了对main-module的不同变体的依赖性,例如testImplementation(project(mapOf("path" to ":main-module", "configuration" to "exportedTestImplementation")))(通过“可消耗”配置继承:main-module的依赖性)

其他参考文献:

相关问题