ちゃんとビルドツールとしてDaikuを使う
そう。Daikuはビルドツールなのでした。なのでこのサイトをビルドするためのDaikufileを書いた。daiku riji
とかやればrijiディレクトリがビルドされるという具合。こんな感じ。
use File::Zglob qw/zglob/;
use File::Copy::Recursive qw/dircopy/;
use File::Path qw/remove_tree/;
sub touch {utime undef, undef, $_ for @_}
task default => 'riji';
file 'node_modules/less/bin/lessc' => sub {
sh qw/npm install less/;
};
desc 'CSS生成';
task css => 'share/static/css/main.css';
file 'share/static/css/main.css' => ['node_modules/less/bin/lessc', zglob('share/static/less/*.less')] => sub {
my $task = shift;
sh qw(mkdir -p share/static/css);
sh 'node_modules/less/bin/lessc -x share/static/less/*.less > ' . $task->dst;
};
desc 'Blog書き出し';
task publish => 'riji';
file riji => ['css', zglob('share/**/*.tx'), zglob('article/**/*.md')] => sub {
my $task = shift;
sh qw(git gc);
require Riji::CLI::Publish;
Riji::CLI::Publish->run;
touch $task->dst;
};
desc 'deploy';
task deploy => '../htdocs/riji';
file '../htdocs/riji' => ['default', grep { -f } zglob('riji/**/*') ] => sub {
my $task = shift;
dircopy(riji => $task->dst);
touch $task->dst;
};
desc 'cleanup';
task clean => sub {
remove_tree('share/static/css', 'riji', 'node_modules');
};
zglob
を使って、依存をリストアップできるのがまあまあ良い。ただ、即時評価になってしまうので関係ないやつも読み込んだ時に全部展開してしまう。Rakeとかはさすがに良くできてて、Rake::FileListという遅延評価するやつが標準で搭載されているのであった。
実際、これくらいだったらMakefileで十分というかこれもMakefileを先に書いてからDaikufileに移植したのであった。Makefileは以下の様な感じ。再帰的に辿るときに$(shell find share -type f -name \*.tx)
とかやらないといけないのが若干めんどくさいけど、これでよくねって言う感じもする。
TX_FILES=$(shell find share -type f -name \*.tx)
MD_FILES=$(shell find article -type f -name \*.md)
BLOG_FILES=$(shell find riji -type f -name \*)
all: riji
css: share/static/css/main.css
share/static/css/main.css: node_modules/less/bin/lessc share/static/less/*.less
mkdir -p share/static/css
node_modules/less/bin/lessc -x $(filter-out $<, $^) > $@
node_modules/less/bin/lessc:
npm install less
riji: share/static/css/main.css $(TX_FILES) $(MD_FILES)
git gc
riji publish
@touch $@
deploy: ../htdocs/riji
../htdocs/riji: riji $(BLOG_FILES)
@mkdir -p $@
cp -r riji ../htdocs/
@touch $@
clean:
rm -rf share/static/css
rm -rf riji/
rm -rf node_modules/
.PHONY: all css deploy clean
Makeは良く出来てるなって今更ながらに思った。タスクランナーとかビルドツールとかで凝ったことをやりたい場合に別のやつを使うのはいいと思うけど、そういった物自体をセットアップするためにMakefileを使うのは良いんじゃないかと改めて思った。
そういやDaikuにwatch taskとか追加するのApp::Watcherとか使えば簡単にできるな、と思ったので、やる気ある人がいればどうぞ。パッチをお待ちしております。