Skip to content

Instantly share code, notes, and snippets.

@makotot
Last active December 11, 2015 13:18
Show Gist options
  • Save makotot/4606402 to your computer and use it in GitHub Desktop.
Save makotot/4606402 to your computer and use it in GitHub Desktop.
Automaton Task automation tool built in JavaScript. AutomationのREADME

JavaScriptでつくられたタスク自動化ツール。

Why?

繰り返しの作業に直面することは度々あるが、その為だけのスクリプトをつくることが一般的である。だけれども、プロジェクト毎に以前作ったものを再利用する必要性を感じると思う。

Automatonは、順序づけられたタスクのリストを用いて、やりたいことを記述するautofileを設定することで、この作業を容易にする。 Automatonを強力なツールにしている理由は、あなたが作った全ての'autofile'はそれ自体を一つのタスクとして他のautofileから利用できる(箱の中の箱を想像してほしい)ことにある。好奇心が強ければ、ソースコードを見ることができるし、Automatonのビルトインの機能がautofilesであることを確認できる。

Built-in tasks

automatonはあなたのタスクを容易にする幾つかのタスクを備えてある。

ROADMAP gruntjsのタスクをサポートしているので、そのタスクをautomatonのタスクのように扱える。

Filesystem

  • chmod : ファイルのモードを変更
  • cp : ファイルやディレクトリをコピー
  • mv : ファイルやディレクトリを移動
  • mkdir : 再帰的にディレクトリを作成
  • rm : 幾つかのファイルかディレクトリを削除
  • symlink : シンボリックリンクを作成

Scaffolding

Scaffoldingのタスクは、テンプレートファイル(どのようなテキストファイルでも)のプレースホルダへの追加や置換などの典型的なタスクを手助けする。これらのタスクはテンプレートファイルの中の{{placeholder_name}}を探し、そのタスクを実行する。

  • scaffolding-append : ファイルのプレースホルダに任意のものを追加
  • scaffolding-replace : プレースホルダを任意のものに置換
  • scaffolding-close : プレースホルダを閉じる(プレースホルダを削除)
  • scaffolding-file-rename : 自身のファイル名で見つかったプレースフォルダを置換することでファイル名をリネーム。

Miscellaneous

  • run : シェルコマンドを実行
  • init : 空のautofileを初期化
  • uglify(soon)
  • minify(soon)
  • concat(soon)

Installing

Automatonのインストールはnpmからnpm install -g automatonで簡単に行える。これでglobalにAutomatonがインストールされ、ターミナルからautomatonを実行できるようになる。 プログラムからautomatonを利用することだけを考えているのであれば、ローカルにインストールすればいい。

Creating a task

Automatonのタスクはそのタスクが何をするか記述しただけの単純なオブジェクト。

Simple task

説明のため、フォルダを作成し、その中にファイルをコピーするだけの単純な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;

More complete task

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;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment