ant + ruby + ERB でテキストファイル生成
可変部を含むテキストファイルを生成する例を作ってみた。
(実は xfy/xvcd, java 用のファイルを生成するための事前の準備実験です)
$ ls
build.xml config.yaml sample01.rb template.txt
こんな風に実行する。
$ ant clean // 生成ファイルを削除する
$ ant // ファイルを生成
$ cat out .txt // 生成したファイルの内容
# Created: 2008-03-16 08:36:03
foo {
a = AA
b = BB
id = ID
<AA>xxx/</AA>
}
#--- End of File ---
日付けが埋め込まれている。AA, BB, ID という部分も実は可変になっている。
以下に 生成テキストのテンプレート、ruby プログラム、設定ファイル、ant の build ファイルを示す。
まずは、テンプレートファイル。<%=*%> の部分が可変部だ。
$ cat template.txt
# Created: <%= Time.new.strftime('%Y-%m-%d %H:%M:%S')%>
foo {
a = <%=a%>
b = <%=b%>
id = <%=_id%>
<<%=a%>>xxx/</<%=a%>>
}
#--- End of File ---
次は変数値の設定ファイル。
$ cat config.yaml
a: AA
b: BB
_id: ID
_id は 本当は id としたいところだが、ruby の id メソッドと名前がぶつかるので _id としている。
(ここで示す例において、変数名が ruby のメソッド名と衝突する場合は_ を付けるなど、利用する側で衝突を避けるようにすることが必要。)
次が ruby スクリプト。
method_missing を利用することで、テンプレートファイル中には
<$=変数名=> と書くだけで、それが変数値に置換されるようにしている。
(スクリプト先頭部に記してある blog 記事のアイデアを参考にした)
$ cat sample01.rb
# See http://jarp.does.notwork.org/diary/200408b.html#20040820
#
YAMLでパラメータを設定して、ERBで展開する方法を摸索。
require 'yaml'
require 'erb'
require 'pp'
module MyTemplate
@conf = YAML.load_file('config.yaml')
def self.run(template)
ERB.new(template).result(binding)
end
def self.method_missing(symbol, *p)
v = @conf[symbol.to_s]
raise "unknown symbol: '#{symbol}' #{p}" if v == nil
v
end
end
# run: ruby sample01 template.txt
template = ARGV.shift
File.open(template) { |ft|
puts MyTemplate.run(ft.read)
}
この ruby スクリプトは、もちろん jruby でも動作する。
最後にこれらを ant で利用するようにまとめた。
$ cat build.xml
<?xml version="1.0" encoding="UTF-8" ?>
<project name="antsample" default="generate">
<property name="dest" value="out.txt"/>
<target name="clean">
<delete file="${dest}"/>
</target>
<target name="generate" depends="clean">
<apply executable="ruby"
output="${dest}"
logError="true"
ignoremissing="false"
failonerror="true">
<srcfile/>
<filelist files="sample01.rb"/>
<arg value="template.txt"/>
</apply>
</target>
</project>
« 人間合格 を観た | トップページ | ピックアップ:mvn archetype:create"だけで良くなった, 企業内で「RSSフィード」を活用する, etc... »
この記事へのコメントは終了しました。
« 人間合格 を観た | トップページ | ピックアップ:mvn archetype:create"だけで良くなった, 企業内で「RSSフィード」を活用する, etc... »
コメント