Phoenix入門 #01

Elixirを全く触った事ないオレがPhoenix入門したログ

## リンク

* http://elixir-lang.org/
* http://www.phoenixframework.org/

## 方針

* 今後も触るかどうか分からない為、Vagrant上に環境を作る
* 面倒なのでドキュメントは後で読む
* CRUDを作る
* 文章量が多くなりそうなので何回かに分ける

## 環境

* Mac OS X 10.10.3
  + Homebrew
  + VirtualBox
  + Vagrant
    - ubuntu trusty64

## インストール

ここでは以下のものをインストールする。

* Erlang
* Elixir
* Phoenix
* Node.js
  + Phoenixで必要

### Vagrant

```shell
mkdir phoenix_start && cd phoenix_start
vagrant init ubuntu/trusty64
vgrant up
```

```Vagrantfile:ruby
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provision "shell", path: 'provision.sh'
end
```

### Erlang, Elixir, Node.js

Erlang, Elixirは公式のINSTALLの通りにインストールする。
Nodeもapt-getでテキトーに。

```provision.sh
# install erlang, elixir
wget http://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
apt-get update
apt-get install -y elixir

# install node, npm
add-apt-repository ppa:chris-lea/node.js
apt-get update
apt-get install -y nodejs npm
```

provisionしてそれぞれのバージョンを確認する。

```shell
$ vagrant provision
...

$ vagrant ssh
...

$ erl -version
Erlang (ASYNC_THREADS) (BEAM) emulator version 6.4.1

$ elixir -v
Elixir 1.0.4

$ node -v
v0.10.37

$ npm -v
1.4.28
```

### Phoenix

Elixirには`mix`というビルド用のコマンドだかがあるらしい。(Rubyでいうgemとrakeみたいなもの?)
まずは`mix`で`hex`というパッケージマネージャを入れる。
hexをインストールするか聞かれるので`y<Enter>`でインストール。

```shell
$ 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
2015-06-07 18:21:34 URL:https://s3.amazonaws.com/s3.hex.pm/installs/1.0.0/hex.ez [262010/262010] -> "/home/vagrant/.mix/archives/hex.ez" [1]
* creating .mix/archives/hex.ez
```

用意ができたのでphoenixをインストールする。

```shell
$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v0.13.1/phoenix_new-0.13.1.ez
Are you sure you want to install archive https://github.com/phoenixframework/phoenix/releases/download/v0.13.1/phoenix_new-0.13.1.ez? [Yn] y
* creating .mix/archives/phoenix_new-0.13.1.ez
```

インストールが済むと`mix`に新しいサブコマンドが追加されている。

```shell
$ mix help | grep phoenix
mix phoenix.new       # Create a new Phoenix v0.13.1 application
```

## Phoenixアプリを生成する

早速追加されたコマンドで生成。
デフォルトのDBはPostgreSQLで、`--database mysql`を付けるとMySQLが使えるようだ。

```shell
$ mix phoenix.new phoenix_blog --database mysql
* creating phoenix_blog/config/config.exs
...
* creating phoenix_blog/priv/static/images/phoenix.png

Fetch and install dependencies? [Yn] y
* running npm install
* running mix deps.get

We are all set! Run your Phoenix application:

    $ cd phoenix_blog
    $ mix phoenix.server

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

    $ iex -S mix phoenix.server
```

ちなみに`-`はapp名を指定しないと許されないらしい。

```shell
$ mix phoenix.new phoenix-blog
** (Mix) Application name must start with a letter and have only lowercase letters, numbers and underscore, got: "phoenix-blog". The application name is inferred from the path, if you'd like to explicitly name the application then use the `--app APP` option.
```

生成が終わったので実行してみる。

```shell
$ cd phoenix_blog
$ 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
* creating /home/vagrant/.mix/rebar
==> poolboy (compile)
Compiled src/poolboy_worker.erl
...
Compiled web/views/layout_view.ex
Generated phoenix_blog app
[info] Running phoenix_blog.Endpoint with Cowboy on port 4000 (http)
07 Jun 18:36:33 - info: compiled 3 files into 2 files in 1680ms
```

最初の起動にはライブラリなどのビルドが実行されるようで少し時間がかかる。
ビルドが終わったので http://192.168.33.10:4000/ (Vagrantfileで指定したIP) にアクセスしてみる。

![Phoenix](https://qiita-image-store.s3.amazonaws.com/0/2222/49843eb9-b400-ba96-784d-a8dd2cc85837.png "Phoenix")

----

今回はここまで。
次回はCRUDを作るパート。

[パート2へ](http://qiita.com/iyuuya/items/6c0124acbed06d0f1f15)