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 に答える