発展: パッケージの導入

  • 時間が余ったら触れる予定

  • mixは、プロジェクトが依存するライブラリパッケージの管理も担当してくれます
    • Ruby でいうところの bundler のようなモノです。rubygems に当たるのが hex です
  • 試しにパッケージを一つ導入してみましょう
  • ここでは、コードに変更があった場合に自動でテストを実行するmix test.watchというツールを導入してみます
  • mix.exsを編集しましょう
diff --git a/myapp/mix.exs b/myapp/mix.exs
index 881a5a9..d5b8dd5 100644
--- a/myapp/mix.exs
+++ b/myapp/mix.exs
@@ -21,7 +21,7 @@ defmodule Myapp.Mixfile do
   # Run "mix help deps" to learn about dependencies.
   defp deps do
     [
-      # {:dep_from_hexpm, "~> 0.3.0"},
+      {:mix_test_watch, "0.6.0", [only: :dev, runtime: false]},
       # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
     ]
   end
  • 保存して、ターミナルから以下のコマンドを実行します
    • [only: :dev, runtime: false]というおまじないは、コンパイル時環境変数によって導入したパッケージの挙動を制御するものです
    • もし興味が湧いたら、こちらから
$ mix deps.get
Resolving Hex dependencies...
Dependency resolution completed:
  file_system 0.2.4
  mix_test_watch 0.6.0
* Getting mix_test_watch (Hex package)
* Getting file_system (Hex package)
  • mix deps.getがプロジェクトが依存するパッケージを取得してくるコマンドになります
    • 直接指定したmix_test_watchだけでなく、間接的に依存することになったfile_systemというパッケージも取得されたことがわかります
    • このような依存性ツリーの解決をmixが担当してくれます
  • deps/ディレクトリ以下にコードが取得されてくるとともに、mix.lockファイルが生成されます
  • mix.lockファイルはすべての依存パッケージの具体的なバージョンが記録されます。このファイルはコミットしておきましょう
    • 次回以降は、あるいは別の環境でこのプロジェクトを clone して開発する場合は、 mix.lockに記録されているバージョンを取得することになるので、開発者間でパッケージバージョンが異なる、といった問題も防げます

  • ちなみに、mix test.watchと実行してみましょう
$ mix test.watch

03:29:38.724 [info]  Compiling file system watcher for Mac...

03:29:40.163 [info]  Done.
==> file_system
Compiling 7 files (.ex)
Generated file_system app
==> mix_test_watch
Compiling 12 files (.ex)
Generated mix_test_watch app

Running tests...
==> file_system
Compiling 7 files (.ex)
Generated file_system app
==> mix_test_watch
Compiling 12 files (.ex)
Generated mix_test_watch app
==> myapp
Compiling 1 file (.ex)
Generated myapp app
..

Finished in 0.03 seconds
2 tests, 0 failures

Randomized with seed 181121
  • 依存パッケージがすべてコンパイルされたあと、テストが実行され、そのままプログラムが実行されたままになることがわかります
  • この状態で、エディタ上でプロジェクトの何らかのファイルを編集・保存すると、 その変更を検知して自動でテストが再実行されます
    • 便利ですのでこのまま利用してみても良いでしょう
    • このような、変更検知&自動ビルド・テスト実行を行うツールはいろいろな言語に存在します

results matching ""

    No results matching ""