我目前正在使用Gradle构建一个项目,它依赖于第三方组件,这是我在编译时需要的,但它将在运行时提供。在maven中,我将按照提供的方式声明此依赖关系,在Gradle中,我将声明如下:
compileOnly group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.4.0.cloudera1'
事实上,我依赖于上面的火花工件并不是真正相关的问题(我提供这个信息,以使这个例子更具体)。
现在,假设我想为我的应用程序(或库,视情况而定)编写一些单元测试。在使用Gradle时,我知道如何做到这一点的唯一方法是笨拙:我将依赖项重新声明为testCompile依赖项,并且我的测试能够运行:
compileOnly group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.4.0.cloudera1'
testCompile group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.4.0.cloudera1'
我真的不喜欢重复和混乱的声明我的依赖性两次,我想知道是否有更好的方法在格拉德尔?
结论
Mike给我的答案是我选择的解决方案,就是把这个放在我的多项目构建的顶级gradle文件中。
subprojects {
sourceSets {
test.compileClasspath += configurations.compileOnly
test.runtimeClasspath += configurations.compileOnly
}
}
发布于 2020-05-13 12:22:03
这实际上是声明Gradle依赖关系的一种非常标准的方法。在许多情况下,可以使用compileOnly
依赖项,而且并不是所有这些都要求在运行时提供依赖项(与Maven的provided
作用域含义不同)。
这一点在Gradle最初关于只编译依赖项(https://blog.gradle.org/introducing-compile-only-dependencies)的声明中有进一步的详细说明:
只编译依赖项解决了许多用例,包括:
编译时需要但在运行时从来不需要processors;
提供。
您所拥有的是为您的主要源代码声明仅编译依赖的惯用方法,这也是测试源的运行时依赖(尽管从技术上讲,最近的Gradle版本会建议您用testImplementation
配置替换已废弃的testImplementation
配置)。
然而,关于Gradle的一个美妙之处是它是高度可定制的。可以修改内置配置(如compileOnly
和testImplementation
)。如果希望更改内置行为,可以修改testImplementation
配置以扩展compileOnly
配置,这将导致在解决testImplementation
时包含所有compileOnly
依赖项:
// give test dependencies access to compileOnly dependencies to emulate providedCompile
configurations {
testImplementation.extendsFrom compileOnly
}
来源:https://discuss.gradle.org/t/compileonly-dependencies-are-not-available-in-tests/15366/8
发布于 2022-01-10 23:38:55
在Kotlin Gradle中,从testImplementation
扩展到compileOnly
configurations {
configurations.testImplementation.get().apply {
extendsFrom(configurations.compileOnly.get())
}
}
https://stackoverflow.com/questions/61783546
复制