构建时如何确保代码在编译之前生成?

How do I ensure code is generated before compiling when building?

我有一个 build.gradle,代码如下:

apply plugin: 'java'
apply plugin: 'application'

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xlint:unchecked"
    }
}

ext.antlr = [
    grammarpackage: "org.shirolang.interpreter",
    antlrSource: 'src/main/java/org/shirolang',
    destinationDir: "src/generated/java"
]

sourceSets{
    generated
    main{
        compileClasspath += generated.output
        runtimeClasspath += generated.output
    }
    test{
        compileClasspath += generated.output
        runtimeClasspath += generated.output
    }
}
project.run.classpath += sourceSets.generated.output

repositories {
    mavenCentral()
}

configurations {
    antlr4
}

sourceSets{
    main{
        java{
            srcDirs 'src/main/java', 'src/antlr/java'
        }
    }
}

dependencies {
    ...
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.4'
}

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

task antlrOutputDir << {
    mkdir(antlr.destinationDir)
}

task generateGrammarSource(dependsOn: antlrOutputDir, type: JavaExec) {
   // code to generate a antlr grammar
}

compileJava {
    dependsOn generateGrammarSource
    classpath += sourceSets.generated.output
}

它输出:

:antlrOutputDir
:compileGeneratedJava UP-TO-DATE
:processGeneratedResources UP-TO-DATE
:generatedClasses UP-TO-DATE
:generateGrammarSource

以及大量缺失符号错误,因为源代码是在 compileGeneratedJava 任务 运行 之后生成的。为什么不将 dependsOn 行添加到 compileJava 任务不会强制它首先变得有趣?

如果我在 run 之前单独 运行 generateGrammarSource,我现在会收到错误,所以我知道代码生成工作正常。

我又试了一个 没用。我似乎无法将任务注入构建周期中的正确位置。如何在编译步骤之前将 generatedGrammarSource 变为 运行?

问题出在我设置srcDirssourceSets块中。它应该是 'src/generated/java' 而不是 'src/antlr/java'。直接列出错误导致gradle看不到生成的源