CentOS7にElixir+Phoenixを入れてみる

最近Elixirが盛り上がってるっぽいのでちょっと試してみることにした

## 流れ

1. Erlang入れる
2. Elixir入れる
3. Phoenix入れる
4. Hello Phoenix!!

残念ながらCentOSのリポジトリに無いのでソースからビルドして入れていきます

# Erlang入れる

## ソースの取得

[Erlang公式 - download](http://www.erlang.org/download.html)に最新版ソースのtarballがあるので、取ってきて解凍

```
cd /usr/local/src
wget http://www.erlang.org/download/otp_src_18.0.tar.gz

tar zxvf otp_src_18.0.tar.gz
cd otp_src_18.0
```

## 依存ライブラリインストール

[Erlang公式のインストールガイド](http://www.erlang.org/doc/installation_guide/INSTALL.html)に依存関係の説明があったので入れておく

* GNU C Compiler
* OpenSSL
* ncurses
* JDK
* fop

あとX Windowsとかも合ったけどGUIアプリじゃないからやめておく

```
yum install \
gcc \
openssl \
openssl-devel \
ncurses \
ncurses-devel \
java-1.7.0-openjdk-devel \
fop
```

## ビルド

```
 ./configure
```

が、configure失敗

```
*********************************************************************
**********************  APPLICATIONS DISABLED  **********************
*********************************************************************

odbc           : ODBC library - link check failed

*********************************************************************
*********************************************************************
**********************  APPLICATIONS INFORMATION  *******************
*********************************************************************

wx             : wxWidgets not found, wx will NOT be usable

*********************************************************************
```

`wx`は入れてないからいいにせよ`odbc`がいるのか
ってことで`odbc`入れる

```
yum install unixODBC unixODBC-devel
```

再びconfigure

```
 ./configure
```

Makefile出来たのでビルド開始

```
make
make install
```

対話シェルでErlangがインストールできたか確認

```
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1>
```

ちなみにデフォルトのインストール先は`/usr/local/lib/erlang`のもよう

# Elixir入れる

## ビルド

[Elixir公式のインストールガイド](http://elixir-lang.org/install.html#compiling-from-source-unix-and-mingw)に手順載ってるのでそれのとおりにやっておく

なお、インストール先はErlangにあわせて`/usr/local/lib`配下にする

```
cd /usr/local/lib
git clone https://github.com/elixir-lang/elixir.git
cd elixir
make clean test
```

パスを通してあげて

```
vi ~/.bash_profile

PATH=$PATH:$HOME/bin
PATH=$PATH:/usr/local/lib/elixir/bin # 追記

export PATH
```

読み込んだら対話シェルで確認

```
source ~/.bash_profile
iex

Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.1.0-dev) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
```

# Phoenix入れる

## パッケージマネージャを入れる

phoenixのパッケージマネージャである`hex`を入れます
ユーティリティの`mix`を使ってこんな感じ

```
mix local.hex

Are you sure you want to install archive https://s3.amazonaws.com/s3.hex.pm/installs/1.0.0/hex.ez? [Yn] y
```

## Phoenix Frameworkを入れる

mixのインストーラーにアーカイブを渡してあげるらしいので、[リポジトリ](https://github.com/phoenixframework/phoenix/releases)から最新のものを食わせてあげる

```
mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v1.0.0/phoenix_new-1.0.0.ez

Are you sure you want to install archive https://github.com/phoenixframework/phoenix/releases/download/v1.0.0/phoenix_new-1.0.0.ez? [Yn] y
```

ユーティリティを確認するとphoenix系のタスクが増えている

```
mix --help | grep phoenix
mix phoenix.new       # Create a new Phoenix v0.17.1 application
```

# Hello Phoenix!!

## プロジェクト作成

とりあえず適当な場所でプロジェクトを新規作成してみる

```
cd ~/workspace
mix phoenix.new hello_phoenix

* creating hello_phoenix/config/config.exs
* creating hello_phoenix/config/dev.exs
* creating hello_phoenix/config/prod.exs
* creating hello_phoenix/config/prod.secret.exs
* creating hello_phoenix/config/test.exs
* creating hello_phoenix/lib/hello_phoenix.ex
* creating hello_phoenix/lib/hello_phoenix/endpoint.ex
* creating hello_phoenix/test/controllers/page_controller_test.exs
* creating hello_phoenix/test/views/error_view_test.exs
* creating hello_phoenix/test/views/page_view_test.exs
* creating hello_phoenix/test/views/layout_view_test.exs
* creating hello_phoenix/test/support/conn_case.ex
* creating hello_phoenix/test/support/channel_case.ex
* creating hello_phoenix/test/test_helper.exs
* creating hello_phoenix/web/channels/user_socket.ex
* creating hello_phoenix/web/controllers/page_controller.ex
* creating hello_phoenix/web/templates/layout/app.html.eex
* creating hello_phoenix/web/templates/page/index.html.eex
* creating hello_phoenix/web/views/error_view.ex
* creating hello_phoenix/web/views/layout_view.ex
* creating hello_phoenix/web/views/page_view.ex
* creating hello_phoenix/web/router.ex
* creating hello_phoenix/web/web.ex
* creating hello_phoenix/mix.exs
* creating hello_phoenix/README.md
* creating hello_phoenix/lib/hello_phoenix/repo.ex
* creating hello_phoenix/test/support/model_case.ex
* creating hello_phoenix/priv/repo/seeds.exs
* creating hello_phoenix/.gitignore
* creating hello_phoenix/brunch-config.js
* creating hello_phoenix/package.json
* creating hello_phoenix/web/static/css/app.css
* creating hello_phoenix/web/static/js/app.js
* creating hello_phoenix/web/static/js/socket.js
* creating hello_phoenix/web/static/assets/robots.txt
* creating hello_phoenix/web/static/assets/images/phoenix.png
* creating hello_phoenix/web/static/assets/favicon.ico

Fetch and install dependencies? [Yn] y

Phoenix uses an optional assets build tool called brunch.io
that requires node.js and npm. Installation instructions for
node.js, which includes npm, can be found at http://nodejs.org.

After npm is installed, install your brunch dependencies by
running inside your app:

    $ npm install

If you don't want brunch.io, you can re-run this generator
with the --no-brunch option.

* running mix deps.get

We are all set! Run your Phoenix application:

    $ cd hello_phoenix
    $ mix ecto.create
    $ mix phoenix.server

You can also run your app inside IEx (Interactive Elixir) as:

    $ iex -S mix phoenix.server

```


途中で依存ライブラリのインストールをするか聞かれるので、Yと答えておく、がNode.jsがない
入れるの忘れてたのでソースからサクっと入れよう

```
cd /usr/local/src
wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz

tar zxvf node-v0.12.7.tar.gz
cd node-v0.12.7

./configure --prefix=/usr/local
make
make install
```

あらためて依存ライブラリをインストール

```
cd hello_phoenix
npm install
```

## サーバ起動

本当は`mix ecto.create`でマイグレーションを行うんだけど今回はスキップ

デフォルトがPostgresだが、MySQLでやりたい場合は`mix phoenix.new hello_phoenix --database mysql`でデフォルトのアダプタをMySQLにすることができる

```
mix phoenix.server

Could not find rebar, which is needed to build dependency :poolboy
I can install a local copy which is just used by mix
Shall I install rebar? [Yn] y


略


[info] Running HelloPhoenix.Endpoint with Cowboy on http://localhost:4000
```

途中でプーリングライブラリを入れていいか聞かれるのでY！
あとはブラウザから確認すればこんな感じの画面が見えるはず

![phoenix.png](https://qiita-image-store.s3.amazonaws.com/0/41164/8cc5c98f-3423-dae1-7cc6-970d202cc30e.png)

これで完了、かとおもいきやコンソールにこんなエラーが

```
[error] backend port not found: :inotifywait
```

https://github.com/phoenixframework/phoenix/issues/776

ライブリロード用のツールがないのが原因みたい
ってことでyumっちゃいましょう

```
yum install inotify-tools
```

再度実行したらエラーもなくなったので、これで完了

とりあえずこれで一通り入れ終わったのでちょこちょこいじっていこうかな