Gradle 从完整构建中排除特定的子项目
Gradle exclude a specific subproject from full build
在我们的 Gradle 项目中,我们想要为功能测试添加一个新模块,该模块需要能够访问其他子项目的依赖项,但仍不能 运行 作为完整项目构建的一部分。如果我尝试这样做,它仍然会被构建:
def javaProjects() {
return subprojects.findAll { it.name != 'functional-tests' }
}
configure(javaProjects()) {
...
}
project(':functional-tests') {
....
}
即使我将功能测试构建移动到它自己的单独 build.gradle 文件中,结果也是一样的。有人可以指出如何实现这一目标吗?
据我所知,不可能 停用 或 排除 项目 included 在 settings.gradle
中。因此它可能在 settings.gradle
中以下列方式完成:
include 'p1', 'p2', 'p3'
if (any_condition_here) {
include 'functional-tests'
}
需要额外检查 build.gradle
- 如果包含项目,则配置项目。
我还想到了 -a
命令行开关,参见 here。也许它会以某种方式有所帮助。
我发现一个更好的解决方案是在命令行或通过构建文件从 运行ning 中排除功能测试。
例如,对于运行除功能测试之外的所有测试,运行:
$ gradle check -x :functional-tests:check
然后在构建项目时,你可以让子项目构建但将它们的测试排除在运行ning之外。
$ gradle clean assemble -x :functional-tests:check
一个更好的选择是在构建文件中禁用功能测试,除非设置了 属性。例如,在您的 build.gradle
中添加:
project('functional-tests') {
test {
onlyIf {
project.hasProperty("functionalTests")
}
}
}
这样,功能测试总是被跳过,除非您指定特定的构建 属性:
$ gradle check
$ gradle -PfunctionalTests check
希望对您有所帮助!
您不能排除子项目,但您可以禁用子项目任务:
gradle.taskGraph.whenReady {
gradle.taskGraph.allTasks.each {
if(it.project == project) {
it.onlyIf { false }
}
}
}
我是这样做的:
//for all sub projects
subprojects {
if (it.name != 'project name') {
//do something
}
}
通过这种方式,我可以排除subprojects
中的一些特殊项目。
您也可以在 allprojects
或 project
中使用它。
顺便提一下,您不需要为 integration/functional 测试创建新模块。我更喜欢制作一个新的专用源集...
这里很好地描述了该方法:https://tomgregory.com/gradle-integration-tests/
在我们的 Gradle 项目中,我们想要为功能测试添加一个新模块,该模块需要能够访问其他子项目的依赖项,但仍不能 运行 作为完整项目构建的一部分。如果我尝试这样做,它仍然会被构建:
def javaProjects() {
return subprojects.findAll { it.name != 'functional-tests' }
}
configure(javaProjects()) {
...
}
project(':functional-tests') {
....
}
即使我将功能测试构建移动到它自己的单独 build.gradle 文件中,结果也是一样的。有人可以指出如何实现这一目标吗?
据我所知,不可能 停用 或 排除 项目 included 在 settings.gradle
中。因此它可能在 settings.gradle
中以下列方式完成:
include 'p1', 'p2', 'p3'
if (any_condition_here) {
include 'functional-tests'
}
需要额外检查 build.gradle
- 如果包含项目,则配置项目。
我还想到了 -a
命令行开关,参见 here。也许它会以某种方式有所帮助。
我发现一个更好的解决方案是在命令行或通过构建文件从 运行ning 中排除功能测试。
例如,对于运行除功能测试之外的所有测试,运行:
$ gradle check -x :functional-tests:check
然后在构建项目时,你可以让子项目构建但将它们的测试排除在运行ning之外。
$ gradle clean assemble -x :functional-tests:check
一个更好的选择是在构建文件中禁用功能测试,除非设置了 属性。例如,在您的 build.gradle
中添加:
project('functional-tests') {
test {
onlyIf {
project.hasProperty("functionalTests")
}
}
}
这样,功能测试总是被跳过,除非您指定特定的构建 属性:
$ gradle check
$ gradle -PfunctionalTests check
希望对您有所帮助!
您不能排除子项目,但您可以禁用子项目任务:
gradle.taskGraph.whenReady {
gradle.taskGraph.allTasks.each {
if(it.project == project) {
it.onlyIf { false }
}
}
}
我是这样做的:
//for all sub projects
subprojects {
if (it.name != 'project name') {
//do something
}
}
通过这种方式,我可以排除subprojects
中的一些特殊项目。
您也可以在 allprojects
或 project
中使用它。
顺便提一下,您不需要为 integration/functional 测试创建新模块。我更喜欢制作一个新的专用源集...
这里很好地描述了该方法:https://tomgregory.com/gradle-integration-tests/