【问题标题】:Gradle: how to configure buildSrc or skip tests from main project?Gradle:如何配置 buildSrc 或从主项目跳过测试?
【发布时间】:2014-01-03 05:30:42
【问题描述】:

我的 buildSrc 构建中有一些相当长的测试,有时我想在开发过程中跳过这些测试,以查看模板更改的效果。它是一个报告生成器,有时我只想调整模板而不需要更新所有测试;然后,当我对输出感到满意时,我会更新它们。

我能够使用以下配置在 buildSrc build.gradle 中实现跳过测试:

test {
    // skip all tests if gradle run with -Pnotests
    try { if (project.ext.notests != null)
        println "skipping tests"
        exclude '**'
    } catch (MissingPropertyException e) {}
}

(如果您有更好的方法来检测可选参数,我很乐意看到它)

但是,这在主要的 gradle 项目中不起作用。我已经尝试了所有我能想到的尝试通过配置传递参数,没有设置环境变量,但我怀疑这也行得通。

一般来说,我发现我无法从主项目配置 buildSrc。我找不到任何获取变量的方法,例如 project.ext.foo 或 ext.foo,也找不到配置 buildSrc“项目”的方法,因为 main build.gradle 中没有部分。就像它存在于自己的岛屿上一样。我试过了:

  • project.ext.notes = true
  • 在 main 中测试 {...}
  • 所有项目 { 测试 {...} }
  • 子项目 { 测试 {...} }
  • 依赖项 { 测试 {...} }
  • buildscript { 测试 {...} }

有没有办法解决这个问题,还是我必须重构我的整个项目以将报告代码移到其他地方,然后我可以配置它并跳过测试?

提前致谢。

【问题讨论】:

    标签: groovy junit gradle build.gradle


    【解决方案1】:

    buildSrc 是一个单独的构建(不是项目),我不知道在触发主构建时影响其执行的方法。 (请注意,构建buildSrc 是评估主构建的构建脚本的先决条件。)我能想到的一些解决方案:

    • 根据需要无条件禁用buildSrc 测试(例如,通过在buildSrc/build.gradle 中设置test.disabled = true
    • buildSrc 分解为单独的构建
    • 更改测试,使其对模板更改不敏感
    • 将对模板更改敏感的测试移动到单独的 Test 任务中,该任务只能手动触发

    PS:从命令行跳过构建测试的最简单方法是-x test。可以使用project.hasProperty("foo") 检测项目属性foo 的存在。

    【讨论】:

    • 谢谢彼得。我的中间解决方案是您的第一个解决方案,但我也希望在构建服务器上具有更大的灵活性。
    • 我怀疑您的第二个解决方案将是最好的 - 这也可能有助于其他领域,例如使我的报告成为可部署的工件。然后使用我在Spock项目中看到的解决方案来使用构建脚本中的类,无需运行测试。我也尝试过主项目中的 -x test 但这并没有级联到 buildSrc。我认为它会适用于项目。
    • 是否有任何方法可以可选地在构建脚本中使用版本化的 maven 工件,当前源?据我所知,这是依赖循环,即构建构建工件,但脚本需要工件是最新的才能运行构建...
    • 我并不是说-x test 级联到buildSrc(什么都没有)。我不知道有什么方法可以让 Gradle 忽略 buildSrc,即使它在那里。
    • 看起来没有test.disabled 属性。对于上面的第一个选项,请使用test.enabled = false
    【解决方案2】:

    我尝试了您对环境变量的想法,它确实有效:

    def skipTests = Boolean.parseBoolean(System.env['BUILDSRC_SKIP_TESTS'])
    
    test {
      enabled = !skipTests
      // ... other settings here ...
    }
    

    (在 Gradle 4.9 中对此进行了测试。)

    也可以使用这样的变量来禁用其他检查,例如:

    tasks.findAll { it.name.startsWith('findbugs') || it.name.startsWith('checkstyle') }
      .each { it.enabled = !skipTests }
    

    【讨论】:

    • 干得好 :) 更新版本的 Gradle 可能会支持它,但自从发布此内容以来,我已经做了很多工作。不过,感谢您对其他人的回答。
    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多