1个Eclipse项目,带有Gradle的2个工件

时间:2015-02-06 17:35:42

标签: eclipse gradle moreunit

我想为我的新项目创建结构,我打算用Gradle构建它。我已经知道,如果我将源和测试放在一个项目中,像MoreUnit这样的插件将轻松处理它并在我想要的地方为我的类创建测试。

然而,当我的项目由几个子项目相互依赖时,它会产生一些尴尬的依赖性问题 - 准确地说,当我想在项目A中的测试中使用一些公共代码然后在项目BI中的测试中重用它时必须这样做一些解决方法,如

project(':B') {
  // ...
  dependencies {
    // ...
    if (noEclipseTask) {
      testCompile project(':A').sourceSets.test.output
    }
  }
}

有时也存在一些评估问题,因此必须引入另一个hack:

project(':B') {
  evaluationDependsOn(':A')
}

将此拆分为2个单独的项目摆脱了该问题,但随后MoreUnit不再能够追踪应该创建新测试文件的位置,并标记哪些方法已经过测试。我没有在MoreUnit配置中找到任何可以修复它的内容,所以我试图从Gradle端解决这个问题。

我们可以安排一些事情,这样我可以有多个子项目,源和测试以maven式方式排列(project/src/javaproject/test/java)但是测试和源代码会创建单独的工件吗?如果我正在解决错误的问题,那么我该如何解决问题?

1 个答案:

答案 0 :(得分:1)

您可以创建一些常见的testenv jar,例如:

sourceSets {
    testenv {
        compileClasspath += main.output
        runtimeClasspath += main.output
    }
}

configurations {
    testenvCompile {
        extendsFrom runtime
    }
    testCompile {
        extendsFrom testenvRuntime
    }
    testenvDefault {
        extendsFrom testenvRuntime
    }
}

task testenvJar(type: Jar, group: 'build', description: 'Assembles a jar archive containing the testenv classes.') {
    from sourceSets.testenv.output

    appendix = 'testenv'

    // add artifacts to testenvRuntime as task 'jar' does automatically (see JavaPlugin#configureArchivesAndComponent:106 and http://www.gradle.org/docs/current/userguide/java_plugin.html, "Figure 23.2. Java plugin - dependency configurations")
    configurations.testenvRuntime.artifacts.add new org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact(testenvJar)
}

task testenvSourcesJar(type: Jar, group: 'build', description: 'Assembles a jar archive containing all testenv sources.') {
    from sourceSets.testenv.allSource

    appendix = 'testenv'
    classifier = 'sources'
}

artifacts {
    archives testenvJar
    archives testenvSourcesJar
}

并在您的依赖项目中使用它,例如

    testCompile project(path: ':common', configuration: 'testenvDefault')

我希望这有帮助!