CentOS8上でElixirをasdf経由でインストールしてPhoenixを動かす

※注意事項：本記事は、2019.09.25時点の内容です。速報的な情報としてお読みください。

# 概要

**CentOS8**が[公式ページ](https://www.centos.org/download/)からダウンロードできるようになったので、ElixirのWebフレームワークであるPhoenixが起動できるかを確認してみました。
なお、CentOS8のインストールの種類は、「サーバ（GUI）」で実施しています。

## 先に結論

起動はできました。
しかし、ライブラリのインストールの準備（というか調査）に少し手間がかかりました。

具体的には、以下の二つのパッケージの確認に手間取りました。

- libyaml-devel
- inotify-tools


所感としては、現状は**dnf**でインストールできる標準パッケージやEPELの環境が整ってから、実施するようにした方が良さそうです。

# Elixirのインストール

CentOS8では、標準でインストールはできない様子。
`dnf install elixir`としても、そんなものないと言われます。

そのため、**asdf**でElixirの環境を準備してみます。

## asdfのインストール

asdfの[公式ページ](https://asdf-vm.com/#/core-manage-asdf-vm)のインストール手順に従い、asdfをインストールしていきます。

gitのインストールは`sudo dnf install git`で実施できます。
gitをインストールしたら、続いてGitHubからasdfのコード一式をcloneしてきます。

```bash
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.7.4
```

続いて、asdfのパスを**.bashrc**に設定します。（bash以外を利用している方は、公式ページをみて読み替えてください。）

```bash
$ echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
$ echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
```

続いて、プラグインを利用するための[依存パッケージをインストール](https://asdf-vm.com/#/core-manage-asdf-vm?id=plugin-dependencies)しますが、ここで一点ハマりポイントがありました。
CentOS8と同じく**dnf**を利用しているFedoraのコマンドで実行すると、「**libyaml-devel**」がdnf経由ではインストールできませんでした。標準のパッケージとしては登録されていないようです。

```bash:libyaml-develは見つからない
$ sudo dnf info  libyaml-devel
メタデータの期限切れの最終確認: 0:34:21 時間前の 2019年09月25日 13時16分32秒 に実施しました。
エラー: 表示するための一致したパッケージはありません
```

[www.rpmfind.net](https://www.rpmfind.net/linux/rpm2html/search.php?query=libyaml-devel&submit=Search+...&system=&arch=)というサイトでCentOS8用のrpmがないか探したり、CenttOS8のEPELも入れてみましたが、**libyaml-devel**はやはり見つかりませんでした。

ただ、幸いなことにErlangとElixirのインストールにおいては、**libyaml-devel**はインストールされていなくても影響がなかったので、今回は抜かした状態で他のパッケージをインストールしました。

```bash:libyaml-develを抜いてインストール
sudo dnf install \
  automake autoconf readline-devel \
  ncurses-devel openssl-devel \
  libxslt-devel libffi-devel libtool unixODBC-devel \
  unzip curl
```

## Erlangのインストール

Elixirをインストールする前にErlangをインストールします。
ここで、Erlangのインストールに「**make**」コマンドが必要になります。
asdfのインストール時にはmakeがインストール対象に含まれていませんでしたので、以下のようなコンパイルでエラーが発生したら、`sudo dnf install make`でmakeをインストールしてください。

```bash:エラーメッセージ
$ asdf install erlang 22.1
〜（略）〜
Building Erlang/OTP 22.1 (asdf_22.1), please wait...
WARNING: It appears a required development package 'make' is not installed.
Configure failed.
checking whether g++ accepts -g... no
checking for ld... ld
checking for mixed cygwin or msys and native VC++ environment... no
checking for mixed cygwin and native MinGW environment... no
checking if we mix cygwin with any native compiler... no
checking if we mix msys with another native compiler... no
checking for env... /bin/env
checking for GNU make... no
configure: error: GNU make is required!
ERROR: /home/mzryuka/.asdf/plugins/erlang/kerl-home/builds/asdf_22.1/otp_src_22.1/make/configure failed!
```

makeがインストールされていれば、erlangのコンパイルが通りました。
※ なお、erlang自体のインストール（コンパイル）には、マシンスペックにもよりますが10分程度の時間がかかります。

```bash:erlangのインストール完了
$ asdf install erlang 22.1
Extracting source code
Building Erlang/OTP 22.1 (asdf_22.1), please wait...
APPLICATIONS DISABLED (See: /home/mzryuka/.asdf/plugins/erlang/kerl-home/builds/asdf_22.1/otp_build_22.1.log)
 * jinterface     : No Java compiler found

APPLICATIONS INFORMATION (See: /home/mzryuka/.asdf/plugins/erlang/kerl-home/builds/asdf_22.1/otp_build_22.1.log)
 * wx             : Can not find C++ compiler
 * No OpenGL headers found, wx will NOT be usable
 * No GLU headers (glu.h) found, wx will NOT be usable
 * wxWidgets not found, wx will NOT be usable

DOCUMENTATION INFORMATION (See: /home/mzryuka/.asdf/plugins/erlang/kerl-home/builds/asdf_22.1/otp_build_22.1.log)
 * documentation  : 
 *                  fop is missing.
 *                  Using fakefop to generate placeholder PDF files.

Erlang/OTP 22.1 (asdf_22.1) has been successfully built
Installing Erlang/OTP 22.1 (asdf_22.1) in /home/mzryuka/.asdf/installs/erlang/22.1...
You can activate this installation running the following command:
. /home/mzryuka/.asdf/installs/erlang/22.1/activate
Later on, you can leave the installation typing:
kerl_deactivate
Cleaning up compilation products for 
Cleaned up compilation products for  under /home/mzryuka/.asdf/plugins/erlang/kerl-home/builds

Erlang 22.1 has been installed. Activate globally with:

    asdf global erlang 22.1

Activate locally in the current folder with:

    asdf local erlang 22.1

$
```

いくつか気になるメッセージも出ていますが、一旦はおいときます。
`asdf global erlang 22.1`を実行して、erlangを実行できるようにしておきます。

## Elixirのインストール

続いて、Elixirのインストールです。
こちらは、あっさりインストールが終わります。

```
$ asdf plugin-add elixir
$ asdf install elixir 1.9.1-otp-22
```

`$ asdf global erlang 1.9.1-otp-22`を実行後、`iex`で起動を確認しておきます。

iexの起動が確認できたらPhoenixのインストールを行います。

# Phoenixのインストール

Elixirのインストールが完了したので、続いてPhoenixのインストールを実行します。
node.js、hex、rebar、Phoenixの順にインストールしていきます。

## node.jsのインストール

CentOS8の標準で、**node.js**の10（10.14.1）がインストール可能です。

```bash:node.jsのインストール
$ sudo dnf install nodejs
```

## hexとrebarのインストール

こちらも特に問題なく実行できます。

```
$ mix local.hex --force
$ mix local.rebar --force
```

## Phoenixのインストール

ひとまず、現時点でPhoenixの最新の1.4.10をインストールします。
こちらも特に問題なく実行できます。

```
$ mix archive.install hex phx_new 1.4.10 --force
```

# Phoenixの実行

## inotify-toolsのインストール

必須ではありませんが、devモードでの実行時では、**inotify-tools**がインストールされていないと`mix phx.server`実行時にワーニングメッセージが出てきます。
そのため、inotify-toolsはインストールするのが良いでしょう。

ただし、残念ながらinotify-toolsも、現時点では標準パッケージやEPELには含まれていませんでした。
幸い、inotify-toolsのバージョンはCentOS7時点から大きく変動していないので、Fedora30で利用されているRPMを使ってインストールしておきます。

```
$ wget http://download-ib01.fedoraproject.org/pub/fedora/linux/updates/30/Everything/x86_64/Packages/i/inotify-tools-3.14-17.fc30.x86_64.rpm

$ sudo rpm -ivh inotify-tools-3.14-17.fc30.x86_64.rpm
```

これで、inotify-toolsについてのメッセージは出てこなくなります。

## PhoenixのTOP画面の起動

まずは、TOP画面が起動することを目指します。DBアクセスについては一旦は省略。
そのため、`--no-ecto`をつけてPhoenixのプロジェクトを作成します。
ここでは、プロジェクト名は「*hiyoko*」にしています。

```
$ mix phx.new hiyoko --no-ecto
```

実行時に聞かれる`Fetch and install dependencies? [Yn]`も`Y`でインストールします。

プロジェクトができたら、プロジェクトディレクトリへ移動した後で`mix phx.server`を実行します。
起動が確認できたら、[localhost:4000](http://localhost:4000)にアクセスします。

![20190925_centos8_phoenix.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316636/b950abdc-a458-a79a-f82c-1046c9b8e24e.png)

無事にTOP画面が表示されました。