0

在我的 Gradle 脚本中,我将 JavaCC 声明为它自己的自定义“javacc”配置中的依赖项。然后,我使用该配置找出 JavaCC JAR 的路径并将该路径写入属性文件,该文件稍后在 Gradle 之外由 Ant 使用。

现在,我build.gradle文件的相关部分如下所示:

configurations {
    javacc
}

repositories {
    mavenCentral()
}

dependencies {
    javacc group: 'net.java.dev.javacc', name: 'javacc', version: '5.0'
}

task cleanBuildHelpers(type: Delete) {
    delete '.buildHelpers/ant.properties'
}

task prepareBuildHelpers(dependsOn: cleanBuildHelpers) << {
    ant.propertyfile(file: '.buildHelpers/ant.properties') {
        entry(key: 'javacc_jar', value: configurations.javacc.files.iterator().next())
    }
}

这就像我想要的那样工作,我可以这样离开它。但是,prepareBuildHelpers每当我运行依赖于它的其他任务时,该任务总是会执行。这没什么大不了的,但我想知道是否有办法让它只在 Gradle 更新 JavaCC JAR 时运行。

我正在考虑检查 JAR 的时间戳并将其与属性文件的时间戳进行比较,但我不知道这是否是正确的方法以及是否有更好、更优雅的方法来执行此操作。

有什么想法或建议吗?

4

1 回答 1

2

正确的解决方案是声明prepareBuildHelpers任务的输入和输出。假设您想在 Jar 文件的路径名(而不是其内容)更改时重新运行任务:

task prepareBuildHelpers(dependsOn: cleanBuildHelpers) {
    inputs.property "javaccJarPath", configurations.javacc.singleFile
    outputs.file '.buildHelpers/ant.properties'
    doLast {
        ant.propertyfile(file: '.buildHelpers/ant.properties') {
            entry(key: 'javacc_jar', value: configurations.javacc.singleFile
        }
    }
}

由于该任务编辑现有文件,因此输出声明不太准确,并且该任务将在对该文件进行任何外部更改后重新运行。如果这是不可取的,请尝试outputs.upToDateWhen { true }

PS:注意在文件集合中引用单个文件的简化方式。

于 2012-08-21T19:07:38.077 回答