我的情况是我的源码包含测试和一些测试支持代码,以及通常的源代码。我希望能够将源代码和测试支持作为单独的工件发布(每个工件都有自己的依赖项集),但显然不是测试类。
我的目录结构如下所示:
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
?
答案 0 :(得分:0)
我想你想在testSupport配置上使用extendsFrom
。我没有创建一组测试项目,但从逻辑上讲,如果你的代码工作但你的deps不然,那么你的配置有问题,而不是sourceSets。
当您声明新的sourceSet时,您会根据配置名称自动获得两个新配置:testSupportCompile
和testSupportRuntime
。请尝试以下操作将您的普通测试代码与testSupport代码链接起来。
configurations {
testSupportCompile.extendsFrom testCompile
testSupportRuntime.extendsFrom testRuntime
}
Gradle肯定会在发布时使用配置,我猜想,由于您没有向testSupportXYZ配置中明确添加任何内容,因此它决定在您以后需要支持工件时没有要解决的依赖项。上面的代码应该链接你的deps,就像链接你的源代码一样,希望能解决你的问题。