2

我有一个多项目构建。我写了一个插件,子项目用来配置测试,我们有 3 种测试风格,每个子项目都有单元测试,但不一定有其他 2。这些插件动态添加到 sourceSets,这可以被覆盖在子项目 build.gradle 中。

我看到的问题是这些测试路径在我生成它们时没有添加到 Idea 模块中,大概是因为在 Idea 插件识别源集之前没有评估我的插件。

顶层 build.gradle 将 Idea 插件应用到所有项目中,而测试插件应用在各个 build.gradle 文件中。

我的问题是:

  1. 我对插件评估顺序的假设是否正确?
  2. 如何影响此评估顺序,以便在评估 Idea 插件之前正确配置源集?

非常感谢

* 编辑 *

在我有的插件中

    private SourceSet configureSourceSet(File classesDir, Project project, testSourceDir) {
        def sourceSet = project.sourceSets.create(sourceSetName())
        sourceSet.output.classesDir = classesDir
        configureClasspathDependencies(project, sourceSet)
        def file = new File("$project.projectDir/$testSourceDir")
        if (project.plugins.hasPlugin('scala')) {
            sourceSet.scala.srcDirs += [file]
        } else {
            sourceSet.java.srcDirs += [file]
        }
        return sourceSet
    }

在模块 build.gradle 文件的顶部,我有

apply plugin: 'unitTest'

在顶级 gradle 文件中我有

allprojects {
    ext.buildDir = './build'

    apply plugin: 'idea'
    apply plugin: 'eclipse'

    idea.module {
        excludeDirs += file('install')
        excludeDirs += file('target')
        excludeDirs += file('tests_log')
        excludeDirs += file('.settings')
        downloadSources = false
    }
    eclipse.classpath {
        downloadSources = false
    }
}

* 编辑 2 *

private void configureTestTask(Project project, File classesDir, SourceSet sourceSet) {
    def testTask = project.tasks.create(taskName(), Test)
    testTask.testClassesDir = classesDir
    testTask.classpath = sourceSet.runtimeClasspath
}
4

1 回答 1

1

我的假设是不正确的。我下载了 gradle 插件源并找到了设置测试源的区域。

private def configureIdeaModuleForJava(Project project) {
    project.ideaModule {
        sourceDirs = project.sourceSets.main.allSource.sourceTrees.srcDirs.flatten()
        testSourceDirs = project.sourceSets.test.allSource.sourceTrees.srcDirs.flatten()
        outputDir = project.sourceSets.main.classesDir
        testOutputDir = project.sourceSets.test.classesDir
        def configurations = project.configurations
        scopes = [
                COMPILE: [plus: [configurations.compile], minus: []],
                RUNTIME: [plus: [configurations.runtime], minus: [configurations.compile]],
                TEST: [plus: [configurations.testRuntime], minus: [configurations.runtime]]
        ]
    }
}

testSourceDirs 只选择源集进行测试,而我的名称有 testUtil。为了克服这个问题,我的 configureSourceSets 变为:

private SourceSet configureSourceSet(File classesDir, Project project, testSourceDir) {
    def sourceSet = project.sourceSets.create(sourceSetName())
    sourceSet.output.classesDir = classesDir
    configureClasspathDependencies(project, sourceSet)
    def file = new File("$project.projectDir/$testSourceDir")
    if (project.plugins.hasPlugin('scala')) {
        sourceSet.scala.srcDirs += [file]
    } else {
        sourceSet.java.srcDirs += [file]
    }
    sourceSet.resources.srcDirs += [file]
    sourceSet.resources.exclude("**/*.java")
    sourceSet.resources.exclude("**/*.scala")
    if (project.plugins.hasPlugin("idea")) {
        project.idea.module {
            testSourceDirs += sourceSet.allSource.srcDirs.flatten()
        }
    }
    return sourceSet
}
于 2013-10-09T11:07:54.527 回答