クロスプラットフォームのタスクランナー runme の紹介
はじめに
この資料は Rust 製のコマンドラインツール runme について紹介するものです。
Rust製の環境構築やツールのインストール方法については以下を参照してください
runme について
クロスプラットフォームで動作するタスクランナーです。
なぜ runme なのか?
クロスプラットフォーム
runmeの実行バイナリはlinux, macos, windowsで利用可能です。
runmeはLinux/macosに組み込まれているbashに依存します。Windowsでは、gitにデフォルトで付属しているbashを自動的に検索して使用します。
ls, rm, grep, sed, awkなどのGnuツールもbashで提供されていますので、Runmefileの中で自由に、そして自信を持って使用することができます。
煩雑なコマンドラインの呼び出しを簡素化
次のような入力が面倒で複雑なコマンドを繰り返し呼び出す必要があるとします。
% aws s3 sync _built/html s3://buck/et --exclude "*" --include "*.html"
次のような Runmefile.sh を用意しておきます。
#!/usr/bin/env bash
set -e
# @cmd
aws_sync() {
echo Run aws_sync
aws s3 sync _built/html s3://buck/et --exclude "*" --include "*.html"
}
eval $(runme --runme-eval "$0" "$@")
あとは、次のコマンド実行するだけになります。
% runme aws_sync
統一された作業方法の共有
例えば、リポジトリにコードの変更をコミットするときに、同僚が自分と同じ手順を踏んでくれるでしょうか? その手順が複雑すぎると言われたら、どうしますか?
そうした場合は、手順を実行する ファイルを提供しましょう。簡単なことであれば、使ってもらえる可能性が高くなります。さらにrunme はクロスプラットフォームで動作するため、チームのメンバーが使用しているOSを気にしてすみます。
使用方法
次のようにタスク名を引数に与えると、雛形の Runmefile.sh を作成してくれます。
$ runme --runme-create build test
iisaka@dev00:~$ cat Runmefile.sh
#!/usr/bin/env bash
set -e
# @cmd
build() {
echo Run build
}
# @cmd
test() {
echo Run test
}
eval $(runme --runme-eval "$0" "$@")
新しいタスクを定義するには、bash関数を作成して、その上に@cmdを追加するだけです。タスクは単なる関数です。
% runme -h
USAGE: Runmefile.sh <COMMAND>
COMMANDS:
build build project [aliases: b]
test test project
% runme test
Run test
% runme b
Run build
タスクのパラメータ
タスクのパラメータを定義するには、コメントタグを使用します。
@arg: 位置決め引数を定義する
@option: オプション引数を定義する
@flag: フラグ引数を定義する
# @cmd Download a file
# @alias d
# @flag -f --force Override existing file
# @option -t --tries <NUM> Set number of retries to NUM
# @arg source! Url to download from
# @arg target Save file to
download() {
echo "cmd: download"
echo "flag: --force $argc_force"
echo "option: --tries $argc_tries"
echo "arg: source $argc_source"
echo "arg: target $argc_target"
}
$ runme download -h
Download a file
USAGE: Runmefile.sh download [OPTIONS] <SOURCE> [TARGET]
ARGS:
<SOURCE> Url to download from
[TARGET] Save file to
OPTIONS:
-f, --force Override existing file
-t, --tries <NUM> Set number of retries to NUM
-h, --help Print help information
また、タスクのパラメータにアクセスするためにシェル変数を使用することができます。
# @cmd
run() {
echo $2 $1 $#
}
$ runme run foo bar
bar foo 2
タスクのエイリアス
# @cmd
# @alias t,tst
test() {
echo "Test..."
}
$ runme t
Test...
タスクの依存関係
関数の呼び出しによって依存関係が確立されます。
# @cmd
bar() { foo;
echo bar
baz; }
# @cmd
foo() {
echo foo
}
# @cmd
baz() {
echo baz
}
$ runme bar
foo
bar
baz
タスクグループ
タスクは、_, -, @, ., : で意味的にグループ化することができます。
# @cmd
test@unit() {}
# @cmd
test@bin() {}
# @cmd
app.build() {}
# @cmd
app.test() {}
デフォルトのタスク
runmeがタスク名を指定せずに起動された場合、main関数が実行されます。main関数が存在しない場合、runmeはヘルプ情報を表示します。
main() {
foo
}
# @cmd
foo() {
echo foo
}
$ runme
foo
シェルパスのカスタマイズ
環境変数 RUNME_SHELL を使って、シェルのパスをカスタマイズすることができます。
RUNME_SHELL="C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe"
スクリプト名のカスタマイズ runmeはデフォルトで以下のスクリプトを検索します。
Runmefile.sh または Runmefile
runmefile.sh または runmefile
RUNMEFILE.sh または RUNMEFILE
環境変数 RUNME_SCRIPT を使用すると、スクリプト名をカスタマイズすることができます。
RUNME_SCRIPT=taskfile.sh
ドキュメント
runme のヘルプメッセージ
% runme --runme-help runme 0.3.0 sigoden <sigoden@gmail.com> A shell-script driven task runner - <https://github.com/sigoden/runme> USAGE: runme --runme-eval SCRIPT [ARGS...] Parse arguments `eval $(runme --runme-eval "$0" "$@")` runme --runme-create [TASKS...] Create a boilerplate runmefile runme --runme-help Print help information runme --runme-version Print version information
ライセンス
この記事が気に入ったらサポートをしてみませんか?