JavaScriptでつくられたタスク自動化ツール。
繰り返しの作業に直面することは度々あるが、その為だけのスクリプトをつくることが一般的である。だけれども、プロジェクト毎に以前作ったものを再利用する必要性を感じると思う。
Automatonは、順序づけられたタスクのリストを用いて、やりたいことを記述するautofile
を設定することで、この作業を容易にする。
Automatonを強力なツールにしている理由は、あなたが作った全ての'autofile'はそれ自体を一つのタスクとして他のautofile
から利用できる(箱の中の箱を想像してほしい)ことにある。好奇心が強ければ、ソースコードを見ることができるし、Automatonのビルトインの機能がautofiles
であることを確認できる。
automaton
はあなたのタスクを容易にする幾つかのタスクを備えてある。
ROADMAP
gruntjs
のタスクをサポートしているので、そのタスクをautomaton
のタスクのように扱える。
- chmod : ファイルのモードを変更
- cp : ファイルやディレクトリをコピー
- mv : ファイルやディレクトリを移動
- mkdir : 再帰的にディレクトリを作成
- rm : 幾つかのファイルかディレクトリを削除
- symlink : シンボリックリンクを作成
Scaffoldingのタスクは、テンプレートファイル(どのようなテキストファイルでも)のプレースホルダへの追加や置換などの典型的なタスクを手助けする。これらのタスクはテンプレートファイルの中の{{placeholder_name}}
を探し、そのタスクを実行する。
- scaffolding-append : ファイルのプレースホルダに任意のものを追加
- scaffolding-replace : プレースホルダを任意のものに置換
- scaffolding-close : プレースホルダを閉じる(プレースホルダを削除)
- scaffolding-file-rename : 自身のファイル名で見つかったプレースフォルダを置換することでファイル名をリネーム。
- run : シェルコマンドを実行
- init : 空の
autofile
を初期化 - uglify(soon)
- minify(soon)
- concat(soon)
Automatonのインストールはnpmからnpm install -g automaton
で簡単に行える。これでglobalにAutomatonがインストールされ、ターミナルからautomaton
を実行できるようになる。
プログラムからautomaton
を利用することだけを考えているのであれば、ローカルにインストールすればいい。
Automatonのタスクはそのタスクが何をするか記述しただけの単純なオブジェクト。
説明のため、フォルダを作成し、その中にファイルをコピーするだけの単純なautofile
を見せる。
var myTask = {
tasks: [
{
task: 'mkdir',
description: 'Create the project root folder',
options: {
dirs: ['some_dir']
}
},
{
task: 'cp',
description: 'Copy some file',
options: {
files: {
'some_file': 'some_dir/dest_file'
}
}
}
]
};
module.exports = myTask;
automaton
のほぼ全ての機能を説明するため、以下に完全なautofile
をコメント付きで見せる。
var task = {
// idは必須ではないが、他のタスクでこのタスクを利用したい場合に必要になり、ユニークであるべき
id: 'example_task',
// ユーザーフレンドリーな名前で
// 参照のためで、必須ではない
name: 'Example task',
// 必須ではない
author: 'Indigo United',
// Descriptionは必須ではないが、タスクの説明に用いることができる
description: 'My example task',
// Filterは必須ではないが、サブタスクを実行する前に幾つかのオプションの操作を実行するのに利用できる
filter: function (options, next) {
// オプションを上書きできる
options.dir2 = options.dir2 + '_indigo';
// 追加オプションを定義することもできる
// このケースではサブタスクで使われるオプション`dir3`を定義
options.dir3 = 'united';
next();
},
// これもまたオプションだが、自動的に必要なオプションをチェックしたいとき役立つ
// それに加えて幾つかの特徴ので以下の情報を確認してほしい
options: {
dir1: {
// Option description は必須ではない
description : 'The name of the folder ' +
'that will hold ' +
'all the subfolders'
},
dir2: {
// デフォルト値が設定されていたら、このオプションは不可欠ではない
'default': 'automaton'
},
// このオプションは以下のようにサブタスクの実行を省略するためのもの
run_all: {
'default': false
}
},
// example_taskが実行されたときに、実行されるサブタスクのリスト
tasks: [
{
task: 'mkdir',
description: 'Create the root and second folder',
options: {
// 受け取った値に置き換わったプレースホルダを持つオプション
dirs: ['{{dir1}}/{{dir2}}']
}
},
{
task: 'mkdir',
// 'on'はfalsyな値を設定することでサブタスクの有効・無効を切り替え可能
// In this case, we even used a placeholder,
// allowing us to skip this subtask depending on the run_all option.
// もちろん`false`のような値を設定することもできる
on: '{{run_all}}',
description: 'Creating other folder',
options: {
dirs: ['{{dir1}}/{{dir2}}/{{dir3}}']
}
},
{
// よりカスタマイズしたものを考えている場合、タスクとしてfunctionをつくれる
// インラインのfunctionについては"Inline functions"のセクションを参照
task : function (opt, ctx, next) {
// optはタスクに渡されるオプションのリスト
// ctx.logでLoggerにアクセスできる
// The Logger should be used to perform any
// logging information, and is preferred to
// any console.* methods, as this gives additional
// control. More information on ctx in the
// "Inline Functions" section.
ctx.log.infoln('I can do whatever I want', opt);
// When the task is done,
// you just call next(),
// not like the MTV show, though…
// (- -')
next();
},
// The 'on' attribute can also be a function
// for more complex cases.
on: function (opt) {
return !!opt.run_all;
}
}
]
};
module.exports = task;