7

プロジェクトを正常にビルドし、必要なすべての成果物をコンパイルする Gradle ビルド スクリプトがあります。

ただし、場合によっては、他の開発者にいくつかのファイルにパッチを適用するオプションを提供したいと考えています。たとえば、アーカイブの 1 つに、データベース フックに関する情報を含む xml ファイルがあります。一部の開発者は、他のバージョン (またはエンジン) を使用しており、ビルド出力を使用する前にこれらを変更する必要があります。

誤ってコミットする可能性があるバージョン管理されたファイルに変更を加える代わりに、ビルド スクリプトが適用するローカルの個別のパッチ ファイルを作成するオプションを提供したいと考えています。

古いantスクリプトでは、次のようなことをしました

<target name="appcontext-patch" if="applicationContext.patch.file">
    <patch patchfile="${applicationContext.patch.file}" originalfile="${dist.dir}/applicationContext.xml"/>
</target>

しかし、Gradleで同等のことを行う方法がわかりません。これを への呼び出しに直接変換しようとするよりも、これを行うためのより良い (つまり、より慣用的な) 方法はありant.patchますか?

いくつかのコンテキスト
これは、ファイルが最初にアーカイブに入る方法です。

into('META-INF') {
    from 'deployment', {
        include 'applicationContext.xml'
        rename { fn ->  "jboss-spring.xml" }
    }
}

次のようなことができれば素晴らしいことです

into('META-INF') {
    from 'deployment', {
        include 'applicationContext.xml'
        rename { fn -> "jboss-spring.xml' }
        patch 'local/applicationContext.xml.patch'
    }
}

ファイルがアーカイブに配置される前に、パッチ ファイルを適用します。これを可能にするコードを書くことは気にしませんが、私は Gradle にまったく慣れていないので、どこから始めればよいかわかりません。

4

3 に答える 3

6

Ant 呼び出しをかなり直接的に gradle に変換できるはずです。

これを一般的に行う方法に関するgradleドキュメント。基本的に、属性は名前付き引数になり、子タグはクロージャーになります。ドキュメントには、良い例がたくさんあります。

Ant タスクを翻訳したら、適切なタスクの doFirst または doLast ブロックに入れることができます。

私の最初の推測は次のようになります。

apply plugin: 'java'

assemble.doFirst {
    ant.patch(patchfile: applicationContext.patch.file,
              originalFile: "${dist.dir}/applicationContext.xml")
}

それはテストされていないので、正しい道を歩み始めることができると確信しています. その意図は、Java プラグインがアーカイブをアセンブルする直前に、gradle にクロージャーを呼び出させることです。この場合、クロージャは xml にパッチを当てる ant アクションを実行します。

または、上記のタスクを使用してコピーを実行し、それにタグ付けすることもできます。

task myCopyTask(type: Copy) {
    ...
} << {
    ant.patch(patchfile: applicationContext.patch.file,
              originalFile: "${dist.dir}/applicationContext.xml")
}

この場合、あなたは自分でタスクを書いており、左シフト演算子 ( <<) は同等です.doLastが、はるかにクールです。どちらの方法を好むかはわかりませんが、そもそもファイルをそこに取得するコピー タスクが既にある場合は、doLast を使用すると、関連するコード ブロックができるだけ互いに近くに保たれると思います。

于 2013-06-12T15:39:46.337 に答える
1

これをさらにオンザフライで実行したい場合は、主に 2 つの手法を考えることができます。どちらもコードを書く必要がありますが、あなたにとってより魅力的かもしれません.gradleにはこの動作がどこにも組み込まれていないと確信しています.

個人的には、コピー タスクの内部をいじる必要がないため、#1 がより良い解決策だと思います。カスタム フィルターは、クリーンで再利用しやすいと感じます。

1)コピー タスクで指定するカスタム フィルターを記述します。カスタム フィルターの作成方法の詳細についてはお答えできませんが、ここから始めます。カスタム フィルターを buildSrc に配置できるはずです (それに関する多くの情報は gradle.org にあります)。それから、それを gradle ファイルの先頭にインポートするだけです。groovyで書けばそのままでも使えると思いますant.patch()

task copyAndPatch() {
    into('META-INF') {
    from 'deployment', {
        include 'applicationContext.xml'
        rename { fn -> "jboss-spring.xml' }
        filter(MyCustomFilterThatDoesAPatch, patchFile: 'local/applicationContext.xml.patch')
    }
}

2)カスタム タスクを作成します。繰り返しますが、詳細は専門家に任せますが、コピー タスクをサブクラス化し、「パッチ」プロパティを追加し、実行中に飛び込んで汚い作業を行うことでおそらく問題を解決できます。

于 2013-06-13T03:48:31.277 に答える