【问题标题】:Gradle: automatically add a test dependency on a projectGradle:自动在项目上添加测试依赖
【发布时间】:2017-05-15 00:12:57
【问题描述】:

在多项目构建中,一些项目依赖于其他项目,后者不仅提供编译/运行时库,还提供有用的测试库(例如,它们提供的组件的“模拟”实现)。

我知道有几种方法可以将一个项目的测试源提供给另一个项目。它们被讨论,例如作为this question 的答案。

我正在寻找一些神奇的方法来自动实现这一点,这样如果一个子项目添加了对另一个子项目的依赖项,它自动将该项目测试源添加到testCompile配置。

我尝试了幼稚的方法:

configure(rootProject.subprojects.findAll {
  it.configurations.getByName("compile")
    .dependencies.any {  
      it.name == project.name 
    } 
 }) {
  dependencies {
    testCompile project.sourceSets.test.output
  }
}

但这不起作用......大概是因为这段代码是在“错误的阶段”(或任何正确的术语)评估的,而其他项目 还不“知道”他们依赖于这个。

我还尝试将(等价的)这个放在根构建文件的末尾(希望到那时其他所有东西都已经配置好了),但这也不起作用。

有没有办法做我在这里寻找的东西?

【问题讨论】:

  • 你不应该做.getByName("test")和/或.getByName("testCompile")吗?
  • 也可以尝试将您的 sn-p 粘贴在 afterEvaluate 块中,例如:docs.gradle.org/current/userguide/…
  • 不,我想在这里getByName('compile')。这个想法是如果“编译”依赖于这个项目,那么“testCompile”需要依赖于测试源。
  • @RaGe 所以,我尝试使用您关于使用afterEvaluate 的建议,并且几乎成功了!我仍然遇到的一个问题是我在主build.gradle 中定义了一个闭包exportTests,如果我在同一个文件中调用它,它会执行我想要的操作,例如exportTest(project(':notifications')),这有点笨拙。我更喜欢从notifications/build.gradle 中调用它,就像exportTests(project) 一样,但是说“未定义导出测试”,即使文档似乎建议在根项目上定义的闭包应该由孩子继承。有什么想法吗?
  • 尝试在子项目中以rootProject.closureVar 的身份访问它?

标签: testing gradle dependencies


【解决方案1】:

我还尝试将(相当于)这个放在根构建文件的末尾

build.gradle 中的声明顺序无关紧要。 Gradle 构建生命周期有两个阶段,配置和执行。在配置中,读取各种 build.gradle 文件,并根据各种任务之间的隐式和显式依赖关系创建执行顺序图。

通常首先评估根 build.gradle,但可以使用 evaluationDependsOnChildren() 强制先评估子项目

您可以监听构建周期的各种事件,而不是在构建脚本中定位,以在某些点运行某些东西。在您的情况下,您希望在评估所有项目后运行您的 sn-p,使用 afterEvaluate() 块。请在此处查看example


您的整体方法的一些可能替代方案:

  • 从下游项目添加 testCompile 依赖,而不是从上游项目注入。将此添加到 root build.gradle:

    subprojects {
        project.configurations.getByName("compile").dependencies.each { 
            if (it.name == foo){ // could be expanded to if it.name in collection
                //inherit testCompile
                project.configurations.dependencies.testCompile += it.sourceSets.test.output
            } 
        }
    }
    

    (伪代码,未测试)

  • 将可共享的测试/模拟组件分离到一个单独的模拟项目中,您可以将其作为 testCompile 依赖项添加到上游和下游项目中

【讨论】:

  • afterEvaluate 有效,谢谢!但是,请在此处查看我的其他问题:stackoverflow.com/questions/41412975/….
  • 嗯,是的,我考虑了替代方案,但重点是避免在每个依赖项目中编写额外的代码。这个想法是提供一个独立的组件,其他模块可以通过简单地在它们的构建文件中添加一个依赖行来“以声明方式”使用它。如果有人想使用这个模块,我们知道他也需要测试装置,所以我们也可以直接把它们给他,而不用让他明确说明。
  • 嗯,gradle.projectsEvaluated 钩子怎么样?
猜你喜欢
  • 2015-04-29
  • 1970-01-01
  • 2015-03-17
  • 2017-06-02
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多