具有动态源目录的Gradle Idea插件

时间:2013-10-07 15:47:40

标签: gradle

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

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

顶级build.gradle在所有项目中应用Idea插件,测试插件应用于各个build.gradle文件。

我的问题是:

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

    *编辑*

    在插件中我有

        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 fle我有

    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
    }
    

1 个答案:

答案 0 :(得分: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
}
相关问题