テンプレートから開発プロジェクトをすばやく作るツール「Rig」
まだまだ開発段階ですが、Gitリポジトリにホストされている雛形からプロジェクトをすばやく造るためのツールRig
を公開しました。
ほぼ、Scalaのgiter8のクローンで、その他に近しいものとしてはNode.jsのyo(yeoman)が挙げられると思います。
実装言語はRustです。わたし自身のRustの勉強をかねてのプロジェクトです。
特徴や導入方法など、日本語でまとめておきます。
(ちなみに、わたしがこのツールを公開する1日前に、まったく同じ用途のエレガントなツール↓がリリースされていて驚きました……!)
特徴
- 特定のプラットフォーム・開発言語に依存していない
- giter8テンプレートを流用できる(制限あり)
インストール
インストーラや実行可能形式での配布はしていません。CargoとRustコンパイラを使ってビルドする必要があります。rustupで一括してインストールするのが簡単でしょう。
ビルドにはCMakeが必要なので、事前にインストールしておいてください。
Cargo
のインストールコマンドで、GitHubリポジトリを直接指定してビルドします。
$ cargo install --git https://github.com/lettenj61/rig
ビルドに成功すれば、パスが自動的に通っているはずです。
使い方
rig
コマンドで起動します。基本的には、GitHubにホストされているリポジトリを、[オーナー]/[リポジトリ]
の形式で引数に指定するだけです。
将来的にはGitHub以外のどんなgitリポジトリからでもテンプレートを導入できるようにしたいのですが、現在はGitHub上のリポジトリしか利用できません。
$ rig lettenj61/rig-test
完全なURLを指定することもできます。
$ rig https://github.com/letenj61/rig-test
giter8プロジェクトを流用する場合は、--giter8
スイッチを使いましょう。
$ rig typesafehub/scala-sbt.g8 --giter8
プロキシ環境下で実行する場合、環境変数http_proxy
にプロキシのURLを設定しておくことで、プロキシを参照します。
(くわしいプロキシURLの書き方は、gitのhttp.proxy
設定方法などを検索してみてください)
このコマンドで、一時フォルダにリポジトリがクローンされます。
リポジトリを取得した後、テンプレートにあらかじめ定義されているデフォルト値に基づいて、プロジェクト名などの入力を促すプロンプトを表示します。
name [Sample Cargo Lib Project]: author [Your name]: greeting [Hello, World!]: version [0.1.0]:
[..]
に囲まれている部分がデフォルト値です。何も入力せずEnter
キーを押すと、デフォルト値が使用されます。
入力されたパラメータは、後述のテンプレート書式の中に展開されます。
テンプレートとパラメータ
テンプレートはテキストファイルであればどんなものでも構いません。Rig
は単純な文字列置換のみを行ないます。
テンプレートの中で、プロジェクトの生成時にパラメータとして受け取った値を展開したい部分に、プレースホルダ
を指定しておきます。
プレースホルダには、$
記号に挟まれた$name$
のような書式を用います。
たとえば、クラス名を受け取りたい場合:
class $class_name$ extends ...
プレースホルダには書式指定を含めることができ、生成される文字列を加工することができます。
class $class_name;Camel$ extends ...
このようなテンプレートに対し、パラメータclass_name
にawesome tool
が指定されると……
class AwesomeTool extends ...
このように先頭が大文字のキャメルケースに変換されて展開されます。
書式指定の方法は、いまのところgiter8に準拠しています。
デフォルト値
パラメータのデフォルト値は、テンプレート・プロジェクトのルートディレクトリに_rig.toml
というTomlファイルが参照されます。
Tomlファイルの構文についてはここでは触れませんが、Rig
がパラメータとして認識するのはトップレベルの文字列、数値(整数・小数)、真偽値、日付だけで、配列とハッシュはスキップされます。
giter8テンプレートの場合は、Tomlファイルの変わりにdefault.properties
というファイルが読み込まれます。
駆け足で紹介してみましたが、まだテストが不十分ですし、実装したい機能もたくさんあります。
引き続き、少しずつでも充実させていこうと思います。