Life is TraversableOnce

programming / Java / Scala / Rust

テンプレートから開発プロジェクトをすばやく作るツール「Rig」

まだまだ開発段階ですが、Gitリポジトリにホストされている雛形からプロジェクトをすばやく造るためのツールRigを公開しました。

github.com

ほぼ、Scalagiter8のクローンで、その他に近しいものとしてはNode.jsのyo(yeoman)が挙げられると思います。

実装言語はRustです。わたし自身のRustの勉強をかねてのプロジェクトです。

特徴や導入方法など、日本語でまとめておきます。

(ちなみに、わたしがこのツールを公開する1日前に、まったく同じ用途のエレガントなツール↓がリリースされていて驚きました……!)

github.com


特徴

  • 特定のプラットフォーム・開発言語に依存していない
  • 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_nameawesome toolが指定されると……

class AwesomeTool extends ...

このように先頭が大文字のキャメルケースに変換されて展開されます。

書式指定の方法は、いまのところgiter8に準拠しています。

デフォルト値

パラメータのデフォルト値は、テンプレート・プロジェクトのルートディレクトリに_rig.tomlというTomlファイルが参照されます。

Tomlファイルの構文についてはここでは触れませんが、Rigがパラメータとして認識するのはトップレベルの文字列、数値(整数・小数)、真偽値、日付だけで、配列とハッシュはスキップされます。

giter8テンプレートの場合は、Tomlファイルの変わりにdefault.propertiesというファイルが読み込まれます。


駆け足で紹介してみましたが、まだテストが不十分ですし、実装したい機能もたくさんあります。

引き続き、少しずつでも充実させていこうと思います。