首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >对于具有compileOnly依赖关系的单元测试,如何避免在运行时为可用性重新声明依赖项?

对于具有compileOnly依赖关系的单元测试,如何避免在运行时为可用性重新声明依赖项?
EN

Stack Overflow用户
提问于 2020-05-13 19:45:52
回答 2查看 1.4K关注 0票数 4

我目前正在使用Gradle构建一个项目,它依赖于第三方组件,这是我在编译时需要的,但它将在运行时提供。在maven中,我将按照提供的方式声明此依赖关系,在Gradle中,我将声明如下:

代码语言:javascript
代码运行次数:0
运行
复制
  compileOnly group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.4.0.cloudera1'

事实上,我依赖于上面的火花工件并不是真正相关的问题(我提供这个信息,以使这个例子更具体)。

现在,假设我想为我的应用程序(或库,视情况而定)编写一些单元测试。在使用Gradle时,我知道如何做到这一点的唯一方法是笨拙:我将依赖项重新声明为testCompile依赖项,并且我的测试能够运行:

代码语言:javascript
代码运行次数:0
运行
复制
  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文件中。

代码语言:javascript
代码运行次数:0
运行
复制
subprojects {

  sourceSets {
    test.compileClasspath += configurations.compileOnly
    test.runtimeClasspath += configurations.compileOnly
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-13 20:22:03

这实际上是声明Gradle依赖关系的一种非常标准的方法。在许多情况下,可以使用compileOnly依赖项,而且并不是所有这些都要求在运行时提供依赖项(与Maven的provided作用域含义不同)。

这一点在Gradle最初关于只编译依赖项(https://blog.gradle.org/introducing-compile-only-dependencies)的声明中有进一步的详细说明:

只编译依赖项解决了许多用例,包括:

编译时需要但在运行时从来不需要processors;

  • Dependencies的
  • 依赖项,例如编译时需要的纯源注释或注释
  • ,但只有在使用某些特性(即k.a)时才在运行时才需要。可选的dependencies;
  • Dependencies,其API在编译时是必需的,但其实现将由消费库、应用程序或运行时environment.

提供。

您所拥有的是为您的主要源代码声明仅编译依赖的惯用方法,这也是测试源的运行时依赖(尽管从技术上讲,最近的Gradle版本会建议您用testImplementation配置替换已废弃的testImplementation配置)。

然而,关于Gradle的一个美妙之处是它是高度可定制的。可以修改内置配置(如compileOnlytestImplementation )。如果希望更改内置行为,可以修改testImplementation配置以扩展compileOnly配置,这将导致在解决testImplementation时包含所有compileOnly依赖项:

代码语言:javascript
代码运行次数:0
运行
复制
// 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

票数 6
EN

Stack Overflow用户

发布于 2022-01-11 07:38:55

在Kotlin Gradle中,从testImplementation扩展到compileOnly

代码语言:javascript
代码运行次数:0
运行
复制
configurations {
    configurations.testImplementation.get().apply {
        extendsFrom(configurations.compileOnly.get())
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61783546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档