构建时如何确保代码在编译之前生成?
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
变为 运行?
问题出在我设置srcDirs
的sourceSets
块中。它应该是 'src/generated/java' 而不是 'src/antlr/java'。直接列出错误导致gradle看不到生成的源
我有一个 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
变为 运行?
问题出在我设置srcDirs
的sourceSets
块中。它应该是 'src/generated/java' 而不是 'src/antlr/java'。直接列出错误导致gradle看不到生成的源