gpt4 book ai didi

gradle - 如何在多模块项目中访问 gradle 中的测试 jar

转载 作者:行者123 更新时间:2023-12-03 05:07:20 27 4
gpt4 key购买 nike

我有多模块项目。从其中一个模块中,我需要从其他模块中引用测试类。我试图这样配置:

// core project
val testJar by tasks.registering(Jar::class) {
archiveClassifier.set("tests")
from(project.the<SourceSetContainer>()["test"].output)
}
val testArtifact by configurations.creating
artifacts.add(testArtifact.name, testJar)

我正在尝试从其他项目中引用该配置:
dependencies {
// other dependencies ommited
api(project(":core"))
testImplementation(project(path = ":core", configuration = "testArtifact"))
}

但是这个配置不起作用。其他项目的编译失败,因为它没有从 core 中看到所需的测试类项目。依赖洞察:
./gradlew :service:dependencyInsight --dependency core --configuration testCompileClasspath

它给出了以下内容:
project :core
variant "apiElements" [
org.gradle.usage = java-api
]
variant "testArtifact" [
Requested attributes not found in the selected variant:
org.gradle.usage = java-api
]

我正在努力理解如何使配置工作,以便我可以编译 service项目的测试类。使用 Kotlin DSL 在 Gradle 5.2.1 上运行。

最佳答案

因此,上述内容在命令行上有效,但在 IDE 中无效。

这是一个基于变体感知依赖管理的变体:

plugins {
`java-library`
}

repositories {
mavenCentral()
}

group = "org.test"
version = "1.0"

val testJar by tasks.registering(Jar::class) {
archiveClassifier.set("tests")
from(project.the<SourceSetContainer>()["test"].output)
}

// Create a configuration for runtime
val testRuntimeElements by configurations.creating {
isCanBeConsumed = true
isCanBeResolved = false
attributes {
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class, Usage.JAVA_RUNTIME_JARS))
}
outgoing {
// Indicate a different capability (defaults to group:name:version)
capability("org.test:lib-test:$version")
}
}

// Second configuration declaration, this is because of the API vs runtime difference Gradle makes and rules around valid multiple variant selection
val testApiElements by configurations.creating {
isCanBeConsumed = true
isCanBeResolved = false
attributes {
// API instead of runtime usage
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class, Usage.JAVA_API_JARS))
}
outgoing {
// Same capability
capability("org.test:lib-test:$version")
}
}

artifacts.add(testRuntimeElements.name, testJar)
artifacts.add(testApiElements.name, testJar)

由于变量感知依赖管理规则,上面看起来很多。但是,如果它是在插件中提取的,则其中大部分都可以排除。

在消费者方面:
testImplementation(project(":lib")) {
capabilities {
// Indicate we want a variant with a specific capability
requireCapability("org.test:lib-test")
}
}

请注意,这需要 Gradle 5.3.1。
IntelliJ 2019.1 中项目的导入正确连接了依赖项,测试代码可以在 IDE 中编译。

关于gradle - 如何在多模块项目中访问 gradle 中的测试 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55239858/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com