使用依赖项构建测试支持工件

时间:2013-06-19 17:48:18

标签: dependencies gradle

我的情况是我的源码包含测试和一些测试支持代码,以及通常的源代码。我希望能够将源代码和测试支持作为单独的工件发布(每个工件都有自己的依赖项集),但显然不是测试类。

我的目录结构如下所示:

src/main/...
src/test/...
src/testsupport/...

我按照惯例定义了一些依赖项:

dependencies {
    compile 'com.sun.jersey:jersey-core:1.17.1'
    ... more compile dependencies...
    testCompile 'com.google.code.gson:gson:2.1'
    ... more testCompile dependencies...
}

我还需要测试支持sourceSet:

sourceSets {
    testSupport {
        java {
            srcDir 'src/testsupport/java'
        }
        resources {
            srcDir 'src/testsupport/resources'
        }
        compileClasspath += sourceSets.test.compileClasspath
        runtimeClasspath += sourceSets.test.runtimeClasspath
    }
}

我必须将测试类路径添加到testSupport,因为testsupport代码具有相同的依赖关系。

最后,为了创建我的工件,我有:

task createTestSupportArtifact (type: Jar) {
    classifier = 'testsupport'
    from sourceSets.testSupport.output
}

artifacts {
    archives file: createTestSupportArtifact.archivePath, builtBy: createTestSupportArtifact
}

但是,在我依赖于这些工件的其他存储库中,它并没有引入testsupport工件的任何依赖关系。我有一些理论为什么(它没有它自己的POM或它不知道范围是在运行时测试),但没有具体的。

有更好的方法吗?也许智能地使用configurations

1 个答案:

答案 0 :(得分:0)

我想你想在testSupport配置上使用extendsFrom。我没有创建一组测试项目,但从逻辑上讲,如果你的代码工作但你的deps不然,那么你的配置有问题,而不是sourceSets。

当您声明新的sourceSet时,您会根据配置名称自动获得两个新配置:testSupportCompiletestSupportRuntime。请尝试以下操作将您的普通测试代码与testSupport代码链接起来。

configurations {
    testSupportCompile.extendsFrom testCompile
    testSupportRuntime.extendsFrom testRuntime
}

Gradle肯定会在发布时使用配置,我猜想,由于您没有向testSupportXYZ配置中明确添加任何内容,因此它决定在您以后需要支持工件时没有要解决的依赖项。上面的代码应该链接你的deps,就像链接你的源代码一样,希望能解决你的问题。