クロスプラットフォームのタスクランナー 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はデフォルトで以下のスクリプトを検索します。

環境変数 RUNME_SCRIPT を使用すると、スクリプト名をカスタマイズすることができます。

RUNME_SCRIPT=taskfile.sh

ドキュメント

  • runme のヘルプメッセージ

    1. % 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

ライセンス

この記事が気に入ったらサポートをしてみませんか?