おそらくはそれさえも平凡な日々

ちゃんとビルドツールとして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とか使えば簡単にできるな、と思ったので、やる気ある人がいればどうぞ。パッチをお待ちしております。

created at
last modified at

2015-01-03T23:02:15+0900

comments powered by Disqus