Gradleでファイルの改行コードをCRLFからLFに変換する
コード
// build.gradle import org.apache.tools.ant.filters.FixCrLfFilter task convert(type: Copy) { from file("CRLFなファイルの置き場所") into file("変換後のファイルの置き場所") filter(FixCrLfFilter, eol:FixCrLfFilter.CrLf.newInstance("lf")) }
ANTLRでの例
今回は、ANTLRv4で出力したコード(Windows環境で出力するとCRLFで出てくる)をLFに変換するコードを記述します。
やり方
1. ANTLRの出力先を一時ディレクトリにする
2でCopyタスクを利用するとき、コピー元とコピー先が一緒だとうまくいかないので、ANTLRv4の出力先を変更します。
Karaffeの例
generateGrammarSource { - outputDirectory = file("${projectDir}/src/main/java/org/karaffe/compiler/frontend/karaffe/antlrautogenerated") + outputDirectory = file("${projectDir}/build/tmp_antlr") }
元々は "${projectDir}/src/main/java/org/karaffe/compiler/frontend/karaffe/antlrautogenerated"
に出力していたのですが、 "${projectDir}/build/tmp_antlr"
に変更しています。
2. 一時ディレクトリから、本来出力したいディレクトリにCopyタスクを使ってコピーする
AntのFixCrLfFilterとCopyタスクを利用して、CRLFからLFに変換します。
task filter(type: Copy, dependsOn: generateGrammarSource) { from file("${projectDir}/build/tmp_antlr") into file("${projectDir}/src/main/java/org/karaffe/compiler/frontend/karaffe/antlrautogenerated") filter(FixCrLfFilter, eol:FixCrLfFilter.CrLf.newInstance("lf")) } compileJava.dependsOn filter
一時ディレクトリに置かれたファイルの改行コードを変換しながら移動するfilter
タスクを実装しました。
このfilter
タスクは、ANTLRが生成したファイルがあることが前提となるので、 dependsOn
に ANTLRプラグインのタスク generateGrammarSource
を設定しています。
さらに、この移動したファイルは compileJava
で利用するため、 compileJavaの依存タスクとしてfilterタスクを追加しています。
これにより、
generateGrammarSource
-> filter
-> compileJava
の順番でタスクが流れていきます。
ANTLR以外で使う場合でも、dependsOnとかを修正すれば使えるかなと。