Jakeを使ってみる

Jake - JavaScript build tool
JavaScript(CommonJS)で記述できるビルドツール
http://github.com/280north/jake

インストール

要Narwhal

% tusk install jake
Updating catalog.
.
.
.
Done.
% jake
No Jakefile found (looking for: jakefile, Jakefile, jakefile.js, Jakefile.js, jakefile.j, Jakefile.j)

JakeはJakefile/Jakefile.jsを書いてタスクを処理させる。


Jakefile.js

var jake = require('jake');

jake.task('Hello', function() {
  print('Hello!');
});

とりあえず、"Hello!"を出力するだけですが
まず、jakeモジュールをインポートして"Hello"というタスクを作っています。


Jakefileができたらjakeにタスクの名前を渡して実行。

% jake Hello
(in /path/to/project)
Hello!
Build took 21 millseconds

Jakefileにdefaultタスクを作っておくと引数無しで
jakeを実行した時に処理するタスクを指定できます。

var jake = require('jake');

jake.task('default', function() {
  print('default task!');
});

jake.task('Hello', function() {
  print('Hello!');
});
% jake
(in /path/to/project)
default task!
Build took 1 millisecond

複数の.jsファイルを1ファイルにまとめて縮小する

実際に複数のファイルをまとめて、縮小しfoo.min.jsみたいなファイルを作ってみます。

// foo.js
function foo() {
  alert('foo.js');
}
// bar.js
function bar() {
  alert('bar.js');
}
// baz.js
function baz() {
  alert('baz.js');
}
1.複数ファイル->1ファイル

まずは、複数ファイルを読み込んで、1ファイルにまとめるconcatタスクを作る。

//Jakefile.js
var jake = require('jake');
var FILE = require('file');

jake.task('concat',  function() {
  var out = '';
  var target = ['foo.js', 'bar.js', 'baz.js'];

  // 各ファイルの中身をoutに代入
  target.map(function(file) {
    out += FILE.read(file);
  });

  if(!FILE.exists('build')) {
    // buildディレクトリ作成
    FILE.mkdir('build');
  }

  // build/foobarbaz.jsを作って
  // foobarbaz.jsにoutの内容(foo/bar/baz.jsの中身)を書き込む
  FILE.write(FILE.join('build/', 'foobarbaz.js'), out);
});

JakefileはCommonJSで書きます。CommonJSの仕様は以下を参照。
http://www.commonjs.org/specs/


これで、jake concatを実行するとfoobarbaz.jsというファイルがbuildディレクトリに作られます。

% ls build/
foobarbaz.js

% cat build/foobarbaz.js
function foo() {
  alert('foo.js');
}
function bar() {
  alert('bar.js');
}
function baz() {
  alert('baz.js');
}
2.1ファイルにまとめたものを縮小する

ファイルの縮小にはcommonjs-shrinksafeというモジュールを使う事ができるので
http://github.com/280north/commonjs-shrinksafe

% tusk install shrinksafe

でインストール。


Jakefileにファイル縮小のタスクを追加します。

var minify = require('minify/shrinksafe');

jake.task('minify', function() {
  var min = minify.compress(FILE.read(FILE.join('build/', 'foobarbaz.js')));
  FILE.write(FILE.join('build/', 'foobarbaz.min.js'), min);
})

concatタスクを終えた後でminifyタスクを行えば、不要なインデントを取り除いたfoobarbaz.min.jsがbuildディレクトリに作成されますが、buildの様な複数タスクをやらせたいので、buildタスクを追加します。


jake.task()には引数に('タスク名', ['依存タスク1', '依存タスク2'...], 関数)を渡せるので、Jakefileに

jake.task('build', ['concat', 'minify']);

を追加。これで、buildタスク実行->concatタスク->minifyタスクの順で実行してくれます。

% jake build
(in /path/to/project)
Build took 445 millseconds
% ls build/
foobarbaz.js		foobarbaz.min.js
% cat build/foobarbaz.min.js
function foo(){
alert("foo.js");
};
function bar(){
alert("bar.js");
};
function baz(){
alert("baz.js");
};

JavaScriptで書けるというのが良いですねー。