5

我想知道是否可以在 gradle 中定义一个源集(例如 integrationTests),它可以应用于所有使用“java”插件的子项目?

就像是

sourceSets {
    integTest {
        java.srcDir file('src/integration-test/java')
        resources.srcDir file('src/integration-test/resources')
        compileClasspath = sourceSets.main.output + configurations.integTest
        runtimeClasspath = output + compileClasspath
    }
}

如此处所述适用于所有java子项目?

感谢有用的提示!

4

2 回答 2

4

您可以通过应用插件过滤构建的子项目。在您的示例中,这将如下所示:

def javaProjects() {
    subprojects.findAll { project -> 
        project.plugins.hasPlugin('java') 
    }
}

configure(javaProjects()) {
    sourceSets {
        integTest {
            java.srcDir file('src/integration-test/java')
            resources.srcDir file('src/integration-test/resources')
            compileClasspath = sourceSets.main.output + configurations.integTest
            runtimeClasspath = output + compileClasspath
        }
    }
}
于 2013-12-11T20:34:38.407 回答
0

因为根项目的构建脚本是在子项目的构建脚本之前评估的,subprojects.findAll{project -> project.plugins.hasPlugin('java')}所以不起作用(至少在我正在使用的 Gradle 4.8.1 中)。

相反,您可以在根项目中注册一个回调,每次在子项目中应用插件时都会调用该回调:

subprojects {
    plugins.withId('java', { _ ->
        sourceSets {
            integTest {
                java.srcDir file('src/integration-test/java')
                resources.srcDir file('src/integration-test/resources')
                compileClasspath = sourceSets.main.output + configurations.integTest
                runtimeClasspath = output + compileClasspath
            }
        }
    })
}
于 2018-07-22T09:58:41.390 回答