nFact

n!

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タスクを使ってコピーする

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が生成したファイルがあることが前提となるので、 dependsOnANTLRプラグインのタスク generateGrammarSource を設定しています。
さらに、この移動したファイルは compileJava で利用するため、 compileJavaの依存タスクとしてfilterタスクを追加しています。
これにより、
generateGrammarSource -> filter -> compileJava の順番でタスクが流れていきます。

ANTLR以外で使う場合でも、dependsOnとかを修正すれば使えるかなと。