プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

【mac】Elixir + Cowboyを使ったアプリ環境構築

  • 2020年9月18日
  • 2020年9月18日
  • 未分類
  • 7view
  • 0件

はじめに

Elixirという言語を使ったアプリケーションのチュートリアルを行います。
どうやらElixir + Phoenixというのが一般的なようです。
node + Express, ruby + ruby on railsのようなイメージでしょうか。

しかし今回は、Elixir単体でプロジェクトを作成し、Cowboyという高速なWebサーバーを併用しアプリケーションを始めてみたいと思います。

前提環境

mac os

インストール

erlangをインストール

Elixirを動かすためのerlang(アーラン)というものをインストールする

brew install erlang

Elixirをインストール

続いてElixir本体をインストール

brew install elixir

インストールの確認

バージョン表記が表示されればOK

elixir -v

プロジェクトの作成

Elixirでの新規プロジェクトの作成はmix newコマンドに続けてアプリケーション名を入れて行います。引数に「–sup」を入れるとSupervision treesを含むアプリケーションが作成されるとのこと。
プロセスの監視を行うデーモン化ツール?ちょっと知識が浅いですが追加した状態で作成します。

mix new hello_app --sup

ズラっとファイルが作成されます。でも他のフレームワークなどと比べるとかなりシンプルな印象ですね。

依存関係の追加方法

依存関係を追加する方法は、nodeでいう「npm i ~」のようにコマンドで行うのではなく、mix.exsファイルに直接追記する形になります。
(JavaScriptが主なので度々比較してしまうのはご容赦下さい。)

mix.exs


  defp deps do
    [
      // 追加
      {:cowboy, git: "https://github.com/ninenines/cowboy.git", tag: "2.0.0-pre.4"}
    ]
  end

メイン処理の追記

ルーティングの設定と、Supervisorの設定を追記します

defmodule hello_app do

# 以下追加
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      worker(__MODULE__, [], function: :run)
    ]

    opts = [strategy: :one_for_one, name: HelloApp.Supervisor]
    Supervisor.start_link(children, opts)
  end

  def run do
    routes = [
      {"/", HelloApp.Handler, []}
    ]

    dispatch = :cowboy_router.compile([{:_, routes}])

    opts = [{:port, 4000}]
    env = %{dispatch: dispatch}

    {:ok, _pid} = :cowboy.start_clear(:http, 100, opts, %{env: env})
  end
end

Handlerの記述

ルーティングで指定したHandlerの中身のファイルを作成します。

hello_app/handler.ex

defmodule HelloApp.Handler do
  def init(req, opts) do
    headers = %{"content-type" => "text/plain"}
    body = "Hello world!"
    {:ok, resp} = :cowboy_req.reply(200, headers, body, req)
    {:ok, resp, opts}
  end
end

依存関係の解決と実行

まず先ほどmix.exsに追記したCowboyの依存関係を解決するために以下のコマンド

mix deps.get

続いてプログラムを実行するために以下のコマンド

iex -S mix

ブラウザで開き表示を確認する(初期ポート4000)

参考

環境構築
https://elixir-lang.jp/install.html
https://qiita.com/hayabusa333/items/f5a1ab7a2121579ead25


文法など
https://elixirschool.com/ja/lessons/basics/basics/
https://dev.classmethod.jp/articles/web_language_topic-elixir_introduction/