1 个 Eclipse 项目,2 个 Gradle 的工件
1 Eclipse project, 2 artifacts with Gradle
我想为我的新项目创建结构,我打算用 Gradle 构建它。我已经知道,如果我将源代码和测试放在一个项目中,像 MoreUnit 这样的插件将很容易处理它,并在我想要的地方为我的 类 创建测试。
然而,当我的项目由多个相互依赖的子项目组成时,它会产生一些尴尬的依赖性问题——准确地说,当我想在项目 A 的测试中使用一些通用代码,然后在我拥有的项目 B 的测试中重用它时做一些变通办法,比如
project(':B') {
// ...
dependencies {
// ...
if (noEclipseTask) {
testCompile project(':A').sourceSets.test.output
}
}
}
有时还会出现一些评估问题,因此必须引入另一个 hack:
project(':B') {
evaluationDependsOn(':A')
}
将其拆分为 2 个单独的项目解决了该问题,但 MoreUnit 无法再跟踪应在何处创建新的测试文件,也无法标记已测试的方法。我没有在 MoreUnit 配置中找到任何可以让我修复它的东西,所以我试图从 Gradle 方面修复它。
我们能否安排一些事情,以便我可以有几个子项目,源代码和测试以类似 maven 的方式安排(project/src/java
,project/test/java
),但测试和源代码将创建单独的工件?如果我解决了错误的问题,那么我应该如何解决正确的问题?
您可以创建一些 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')
希望对您有所帮助!
我想为我的新项目创建结构,我打算用 Gradle 构建它。我已经知道,如果我将源代码和测试放在一个项目中,像 MoreUnit 这样的插件将很容易处理它,并在我想要的地方为我的 类 创建测试。
然而,当我的项目由多个相互依赖的子项目组成时,它会产生一些尴尬的依赖性问题——准确地说,当我想在项目 A 的测试中使用一些通用代码,然后在我拥有的项目 B 的测试中重用它时做一些变通办法,比如
project(':B') {
// ...
dependencies {
// ...
if (noEclipseTask) {
testCompile project(':A').sourceSets.test.output
}
}
}
有时还会出现一些评估问题,因此必须引入另一个 hack:
project(':B') {
evaluationDependsOn(':A')
}
将其拆分为 2 个单独的项目解决了该问题,但 MoreUnit 无法再跟踪应在何处创建新的测试文件,也无法标记已测试的方法。我没有在 MoreUnit 配置中找到任何可以让我修复它的东西,所以我试图从 Gradle 方面修复它。
我们能否安排一些事情,以便我可以有几个子项目,源代码和测试以类似 maven 的方式安排(project/src/java
,project/test/java
),但测试和源代码将创建单独的工件?如果我解决了错误的问题,那么我应该如何解决正确的问题?
您可以创建一些 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')
希望对您有所帮助!