rebar3について

# rebar3について
[rebar3](https://github.com/rebar/rebar3)は[rebar](https://github.com/rebar/rebar)の次のバージョンである.
rebar3のREADMEで書かれている通り, 現状rebarのいくつかの機能が壊れており作り直しをしている.

例えば, eunitでsuiteの指定がうまくいかないなどの問題が改善されるということで, 「rebar3はよ！！」となっていたので, alpha版とはいえ試してみることにした.

なので,備忘録的に各種コマンドについて残しておく.
また,従来のrebarとの差異については自分が分かる範囲で,「主な変更点」という形でそれぞれの項目に書いてあるので参考にして欲しい.

ちなみに, [公式のドキュメント](http://www.rebar3.org/v3.0/docs)もある.

## compile, xref, dialyzer
### 主な変更点
dialyzerをサポートするようになった. (多分サポートしていなかったと思う)

### 各種コマンド
#### rebar3 compile
get-deps + compileに相当する.

#### rebar3 xref
いくつかのconfが指定可能.

```erlang
$ rebar3 help xref
```
で出てくるので, これを参照すると良い.

#### rebar3 dialyzer
`_build/default/17.4.plt`のようにerlangのバージョンごとに`plt`を生成する為, 複数のバージョンで開発している人にとっては便利な仕様になっている.

## テスト関係 (eunit, ct)
### 主な変更点
- `ct_dir`に`beam`が作成されることがなくなった
- `ct`関係の`rebar.config`の書き方の変更
- `eunit`, `ct`時に`erl_opts`が反映されるようになった

### 各種コマンド
#### rebar3 eunit
```bash
$ rebar3 eunit [--app <app>] [-c <cover>] [--suite <suite>] [-v <verbose]
```

|option|指定方法|概要|
|:---|:---|:---|
|app|`A,B`|実行するapplicationを指定する|
|c|`true`/`false`|`_build/test/cover`にカバレッジの結果を出力する|
|suite|`A,B`|テストを実行するモジュールを指定する. `hoge`を指定すると`hoge_tests`も対象になる.(逆に`hoge_tests`は指定できない)|
|v|`true`/`false`|verboseが標準出力に出る|

`-c`オプションは`rebar.config`の`{cover_enabled, true}`で指定可能.

#### rebar3 ct
オプションが多いので, 使いそうなところだけ抜粋. (`rebar3 help ct`でその他のオプションについては表示されます)

```bash
$ rebar3 ct [--suite <suite>] [-c <cover>] [-v <verbose>]
```

`ct`で`suite`を指定する場合は以下のように指定する

```bash
$ rebar3 ct --suite ct/hoge_SUITE,ct/fugo_SUITE
$ rebar3 ct --suite hoge_SUITE,fugo_SUITE --dir ct
```

また, `ct_dir`の指定方法は以下に変更になった.

```bash
{ct_opts, [{dir, "ct"}]}.
```

#### rebar3 cover
`-c true`を指定して作成されたカバレッジデータを読める状態にして吐き出す. 
従来であれば`eunit`実行時に出力がされていたが分かれたようだ.

`eunit`と`ct`で同じパスにカバレッジデータを吐き出してくれるので, 使いやすくなった気はする.

## 外部ライブラリ関係
### 主な変更点
elixirのmixを参考にした点が要所要所に見られる.

- 外部ライブラリの配置位置が`_build/(default|test)/lib/`になった
- `rebar.lock`ファイルが生成され, リビジョンを固定することができる
- [hex](https://hex.pm/)に登録されたライブラリが簡単に使える

### バージョンの指定方法
従来に加えて, hexを利用することができる.
[rebar.config.sample](https://github.com/rebar/rebar3/blob/162f0f8f63c99c6a9800ef1911060fad8b257b8b/rebar.config.sample#L95)にある`atom`のみの指定がこれに当たる.

また, 外部ライブラリと異なるバージョンを指定していた場合は 「rootのアプリケーションで指定したバージョンは最優先」となる.

### 各種コマンド
従来の`get-deps`にあたるコマンドが廃止され, `compile`など必要な際に自動的に取得される.

#### rebar3 update
`hex`に保存されているregistryを更新する. 前述の`hex`を利用した指定をしない場合は不要なコマンド.

#### rebar3 upgrade
- `rebar.config`に記載された`deps`から`rebar.lock`ファイルを更新する
- 外部ライブラリを更新された`rebar.lock`に合わせて変更する

```bash
# a,b,cを更新する
$ rebar3 upgrade a,b,c
# 全て更新する
$ rebar3 upgrade
```

このコマンドを叩かない限りは`deps`のバージョンは変更されない為, `deps`で`git checkout`して作業するなどは従来通りできる. (そういう需要があるのかは知らない)

#### rebar3 unlock
- `rebar.lock`から指定した外部ライブラリを削除する
- 指定しなかった場合は`rebar.lock`が削除される

```bash
$ rebar3 unlock a,b,c
$ rebar3 unlock
```

## その他のコマンド
リリース用のコマンドなどは使ったことがないので, 割愛する.

### 主な変更点
- clean対象の指定方法が変更になった.
- templateのパスが変更になった

### rebar3 shell
外部ライブラリとアプリケーションのパスを通してerlang shellを立ち上げてくれる.
reloaderとかを使おうと思ったら自前でコマンドを書くしかない気がする. (方法があったら教えてください)

### rebar3 clean
従来では自分でcleanするパスを指定していたが, 基本的には指定しないように変更になった.
`_build/default/lib/*/ebin`にある`beam`しか消されないが, `compile`/`eunit`/`ct`時に削除されたモジュールの`beam`は消してくれるようだ. (完全に確かめられた訳ではないが...)

また, NIFを使うなど他のディレクトリもcleanしたい場合は`rebar.config`の`pre_hook`などで指定する.

### rebar3 edoc
edocを出力する. 標準では何も吐き出さない為, docletをどこかしらから探してくる必要があるようだ.
edownをよく使っている.

### rebar3 new
従来の`create`相当. templateからモジュールなどを自動生成する.

templateはbuilt-inの他にcustomとして自分で作成したtemplate (`~/.config/rebar3/templates`に置くこと) が使用でき, この一覧は以下のコマンドで取得できる

```bash
$ rebar3 new help
```

また,`(TEMPLATENAME)_README.md`で`help`を記述することが可能になった.