- KVアプリケーションは完成したので次にそれを実装するTCPサーバーを作成する。その前に
Mix
のDependency
について理解する。
External dependencies
- 外部依存はビジネスドメインに縛られない。例えば今のKVアプリケーションのためにHTTP APIが必要であれば外部依存するパッケージとして
Plug
を使う。
- パッケージは
Hex Package Manager
に登録されている。依存関係は mix.exs
のdeps
関数に定義する。
def deps do
# 0.5.x で最新のバージョンを取得
[{:plug, "~> 0.5.0"}]
end
- Hexで管理されているパッケージは安定版だが、開発中のものを使いたいときはgit経由でも書くことができる。
def deps do
[{:plug, git: "git://github.com/elixir-lang/plug.git"}]
end
- 依存パッケージを追加してコンパイルすると
Mix
はmix.lock
を生成する。これは依存関係にあるパッケージのどのバージョンを使ったかが記録されている。
Internal dependencies
- 内部依存はプロジェクト特有のもので、プロジェクト外では意味をなさずプライベートにしておきたいもので、内部依存のアプリケーションを使いたい場合は、git経由か、
umbrella projects
という方法がある。umbrella projects
を使うと一つのプロジェクトの中に複数のアプリケーションをホストでき、単一のリポジトリで管理できるので通常はこちらを使う方が管理しやすい。これまでに作ったKVアプリケーションを含んだプロジェクト kv_umbrella
を作成する。
Umbrella projects
- 複数のアプリケーションを管理する
kv_umbrella
を新しく作成する。mix new
のときに--umbrella
オプションを付与する。
mix new kv_umbrella --umbrella
- 実行するとコンソールに表示される内容が
--umbrella
なしでmix new
したときと変わっているはずだ。mix.exs
のコードもまた変わっている。--umbrella
オプションを指定したことでこのアプリケーションがumbrella
として動作するようになった。
- 次に
kv_umbrella/apps/
に移動してkv_server
アプリケーションを作成する。こちらは作成の際に--sup
オプションをつける。これはMix
が自動でsupervision tree
を生成してくれるようになる。
mix new kv_server --module KVServer --sup
defmodule KVServer.Mixfile do
use Mix.Project
def project do
[app: :kv_server,
version: "0.0.1",
deps_path: "../../deps",
lockfile: "../../mix.lock",
elixir: "~> 1.0",
deps: deps]
end
def application do
[applications: [:logger],
mod: {KVServer, []}]
end
defp deps do
[]
end
end
deps_path
とlockfile
が追加されているが、これはappsの下でmix new
をしたことでMix
が自動で全体の構造を解釈して追加している。このアプリケーションが外部依存するパッケージはkv_umbrella
と共有されることになった。
- また、
application/0
の中も変わって、mod: {KVServer, []}
が追加されている。これは--sup
フラグを追加したことによるもので、KVServer
が全体のアプリケーションのsupervision tree
を開始することを意味する。
lib/kv_server.ex
の中を見ると前の章で作成したsupervisor
の実装が自動で組み込まれていることがわかる。あとはこれに監督されるアプリケーションを追加していく。
In umbrella dependencies
apps/kv_server/mix.exs
を開いてkv
を追加する。
defp deps do
# kvがkv_serverの中で使えるようになる
[{:kv, in_umbrella: true}]
end
deps
は依存関係を解決するだけなのでKVアプリケーションが開始されるわけではない。applicaiton/0
に追加してKVアプリケーションが開始されるようにする。
def application do
# kv_serverが開始されれば`kv`も開始されるようになる
[applications: [:logger, :kv],
mod: {KVServer, []}]
end
- 次に
apps
の下に今まで作成したKVアプリケーションを移動する。KVのmix.exs
もKVServerと同様に以下のコードを追加しておく。
deps_path: "../../deps",
lockfile: "../../mix.lock",
- ここまで出来たら
kv_umbrella
のrootに移動してmix test
を実行してみる。2つのアプリケーションのテストが走るはず。
- このように
Umbrella Project
はアプリケーションを管理するのに便利である。管理されるアプリケーションは切り離されていて個別の設定が定義できる。個別に開発することもできるし、リストを明示的にして一緒に使うこともできる。