Elixir入門: Plugを使うには
Tags: elixir, webdev, tutorial, programming
Published: 2019-01-08 02:57:06

---
title: Elixir入門: Plugを使うには
published: true
description: Plugは、webライブラリやフレームワークを構築するための基盤となるプロジェクトです。Plugライブラリを使うと、開発者はwebサーバーで動く独自のPlugが定められます。Plugをインストールして簡単なコードをローカルサーバーで開いてみます。
tags: #elixir, #webdev, #tutorial, #programming
---

本稿は、「Elixir入門」シリーズの番外編として、`Plug`ライブラリのインストールから立ち上げまでをご説明します。

[`Plug`](https://github.com/elixir-plug/plug)は、webライブラリやフレームワークを構築するための基盤となるプロジェクトです。Plugライブラリを使うと、開発者はwebサーバーで動く独自のPlugが定められます。ここでは、`Plug`をインストールして簡単なコードをローカルサーバーで開いてみます。

`Plug`にはつぎのふたつの役割があります。

- webアプリケーション間で組み立てられるモジュールの仕様
- Erlang VMにおける異なるwebサーバー用の接続アダプター

# mixでElixirプロジェクトをつくる
まず、[mix](https://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html)でElixirプロジェクトをつくります。コマンドラインツールで[`mix new`コマンド](https://hexdocs.pm/mix/Mix.Tasks.New.html)に続けて、プロジェクト名のパスを打ち込んでください。

```terminal
$ mix new my_plug
```

プロジェクトのパス(`my_plug`)がつくられて、つぎのようなファイルをつくったことが示されるはずです(図001)。

```terminal
* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/my_plug.ex
* creating test
* creating test/test_helper.exs
* creating test/my_plug_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:
```

#### 図001■mixでつくられたプロジェクトファイル
![elixir_plug_001.png](https://thepracticaldev.s3.amazonaws.com/i/6zoe2qaajx3cfi9bkkjh.png)

# Plugのインストール
アプリケーションのディレクトリ(`my_plug`)に切り替えたら、ファイル`mix.exs`の`application`と`deps`につぎのように依存関係を加えます。`:plug_cowboy`は、webサーバーとしてCowboyをPlugとともに使う設定です。

```elixir
defmodule MyPlug.MixProject do

  def application do
    [

      applications: [:plug_cowboy]
    ]
  end

  defp deps do
    [
      {:plug_cowboy, "~> 2.0"}
    ]
  end
end
```

- `application`: アプリケーションの依存関係を定めます。
- `deps`: プロジェクトの依存関係を定めます。

そして、[`mix deps.get`コマンド](https://hexdocs.pm/mix/Mix.Tasks.Deps.Get.html)で依存関係を解決してください。

```terminal
$ mix deps.get
```

```terminal
Resolving Hex dependencies...
Dependency resolution completed:
New:
  cowboy 2.6.1
  cowlib 2.7.0
  mime 1.3.1
  plug 1.7.1
  plug_cowboy 2.0.1
  plug_crypto 1.0.0
  ranch 1.7.1
* Getting plug_cowboy (Hex package)
* Getting cowboy (Hex package)
* Getting plug (Hex package)
* Getting mime (Hex package)
* Getting plug_crypto (Hex package)
* Getting cowlib (Hex package)
* Getting ranch (Hex package)
```


# サンプルコードを動かす
mixでつくられたプロジェクトファイル`my_plug.ex`のモジュール`MyPlug`に、つぎのテスト用の関数を定めます。

```elixir
defmodule MyPlug do
  import Plug.Conn
  def init(options) do
    # optionsの初期化
    options
  end
  def call(conn, _opts) do
    conn
    |> put_resp_content_type("text/plain")
    |> send_resp(200, "Hello world")
  end
end
```

そして、mixプロジェクトをつぎのように`iex`のセッションで開きます。

```terminal
$ iex -S mix
```

`Plug`アプリケーションの中で前掲モジュールを動かすのがつぎのコードです。ターミナルからサーバーが起ち上がります。[http://localhost:4000/](http://localhost:4000/)のURLを開くと、ページに"Hello world"のテキストが示されるでしょう(図002)。これで、`Plug`アプリケーションが起動できました。

```elixir
iex> {:ok, _} = Plug.Cowboy.http MyPlug, []
{:ok, #PID<0.208.0>}
```

#### 図002■サーバーから開いたページにテキストが示される
![elixir_plug_002.png](https://thepracticaldev.s3.amazonaws.com/i/h090sjgi3626ow8vxilh.png)


#### Elixir入門もくじ
- [Elixir入門 01: コードを書いて試してみる](https://dev.to/gumi/elixir-01--2585)
- [Elixir入門 02: 型の基本](https://dev.to/gumi/elixir-02--30n1)
- [Elixir入門 03: 演算子の基本](https://dev.to/gumi/elixir-03--33im)
- [Elixir入門 04: パターンマッチング](https://dev.to/gumi/elixir-04--1346)
- [Elixir入門 05: 条件 - case/cond/if](https://dev.to/gumi/elixir-05----casecondif-60o)
- [Elixir入門 06: バイナリと文字列および文字リスト](https://dev.to/gumi/elixir-06--35na)
- [Elixir入門 07: キーワードリストとマップ](https://dev.to/gumi/elixir-07--39hi)
- [Elixir入門 08: モジュールと関数](https://dev.to/gumi/elixir-08--1c4c)
- [Elixir入門 09: 再帰](https://dev.to/gumi/elixir-09--1a0p)
- [Elixir入門 10: EnumとStream](https://dev.to/gumi/elixir-10-enumstream-4fpb)
- [Elixir入門 11: プロセス](https://dev.to/gumi/elixir-11--2mia)
- [Elixir入門 12: 入出力とファイルシステム](https://dev.to/gumi/elixir-12--4og6)
- [Elixir入門 13: aliasとrequireおよびimport](https://dev.to/gumi/elixir-13-aliasrequireimport-55c1)
- [Elixir入門 14: モジュールの属性](https://dev.to/gumi/elixir-14--3511)
- [Elixir入門 15: 構造体](https://dev.to/gumi/elixir-15--4f43)
- [Elixir入門 16: プロトコル](https://dev.to/gumi/elixir-16--lif)
- [Elixir入門 17: 内包表記](https://dev.to/gumi/elixir-17--5gci)
- [Elixir入門 18: シギル](https://dev.to/gumi/elixir-18--5791)
- [Elixir入門 19: tryとcatchおよびrescue](https://dev.to/gumi/elixir-19-trycatchrescue-50i8)
- [Elixir入門 20: 型の仕様とビヘイビア](https://dev.to/gumi/elixir-20--j50)
- [Elixir入門 21: デバッグ](https://dev.to/gumi/elixir-21--21a1)
- [Elixir入門 22: Erlangライブラリ](https://dev.to/gumi/elixir-22-erlang-2492)
- [Elixir入門 23: つぎのステップ](https://dev.to/gumi/elixir-23--50ik)

##### 番外
- Elixir入門: Plugを使うには