Mix.install/2 で お手軽に依存ライブラリ(Hex) をインストールしてElixirプログラムをイゴかす

# はじめに
- [Elixir](https://elixir-lang.org/) 楽しんでいますか:bangbang::bangbang::bangbang:
- HTTPクライアントライブラリ[HTTPoison](https://github.com/edgurgel/httpoison)、すんごい速いJSONライブラリ[Jason](https://github.com/michalmuskala/jason)等、[Elixir](https://elixir-lang.org/)には便利なものが[Hex](https://hex.pm/)と呼ばれる形で提供されています
- [Hex](https://hex.pm/)を使う際にはこれまでは、`mix new hello_world`って感じでプロジェクトを作って、`mix.exs`に依存関係を書いて、`mix deps.get`でインストールするという手順が必要です
- これって面倒くさくないですか[^1]
- 朗報です
- [Mix.install/2](https://hexdocs.pm/mix/1.12.0-rc.0/Mix.html#install/2)というものが、Elixir 1.12から追加されます
- これを使うことにより、ちょっとしたお試し用`.exs`ファイルでお手軽にElixirプログラムをイゴかすことができます
- 本記事は、2021/04/15(木)19:00 〜 21:00に開催された[OkazaKirin.beam #49](https://okazakirin-beam.connpass.com/event/210768/)での成果です
    - @pojiro さん、ありがとうございます！

# [Elixir](https://elixir-lang.org/)をインストールする
- https://qiita.com/torifukukaiou/items/aecb1297672163f7d5f4#how-to-install-elixir
- 2021/04/15現在、`1.12.0-rc.0`をインストールしてください

# ソースコードを書く！

```elixir:awesome.exs
Mix.install([{:jason, "~> 1.2"}, {:httpoison, "~> 1.8"}])

"https://qiita.com/api/v2/items?query=elixir"
|> HTTPoison.get!()
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.take(&1, ["title", "url"]))
|> IO.inspect()
```

# 実行する
```elixir
$ elixir awesome.exs 
[
  %{
    "title" => "Livebookを動かす (Elixir)",
    "url" => "https://qiita.com/torifukukaiou/items/3847c68293ed9b94ba2d"
  },
  %{
    "title" => "②Elixirユーザ認証ライブラリ「phx_gen_auth」の本番向け改造点：バリデーションのカスタマイズ",
    "url" => "https://qiita.com/piacerex/items/5f11e33db748830c7636"
  },
  %{
    "title" => "Nx,Axonで始めるゼロから作るディープラーニング  7章畳み込みニューラルネットワーク",
    "url" => "https://qiita.com/the_haigo/items/a4be7812b97bdddd6c1c"
  },
  %{
    "title" => "Elixirのコレクションとマップについて",
    "url" => "https://qiita.com/Gsann/items/82c1b41939d9319a0219"
  },
  %{
    "title" => "[javascript] ダブルタップでブラウザが拡大するのを防ぐ",
    "url" => "https://qiita.com/ELIXIR/items/1d007313c09489738e26"
  },
  %{
    "title" => "初心者(2年ぶり3度目)がブラウザ上からFirebaseにHello Worldをホストする",
    "url" => "https://qiita.com/ELIXIR/items/37d8a4139ec5d346e1ac"
  },
  %{
    "title" => "【毎日自動更新】Java開発者のためのAzure入門(2021/4/6–2021/5/9) LGTMランキング！",
    "url" => "https://qiita.com/torifukukaiou/items/9cfefb20ec347514576b"
  },
  %{
    "title" => "①Elixirユーザ認証ライブラリ「phx_gen_auth」の本番向け改造点：ユーザ登録時等のメール通知追加",
    "url" => "https://qiita.com/piacerex/items/35dc7ee8129b9a1deb9d"
  },
  %{
    "title" => "Elixir, Phoenix, LiveView & PubSubでリアルタイムにページ更新",
    "url" => "https://qiita.com/mnishiguchi/items/b528dccde6c531206eb9"
  },
  %{
    "title" => "PhoenixのAPIサーバー向け簡易トークン認証",
    "url" => "https://qiita.com/mnishiguchi/items/2a447f9138c5b61e1147"
  },
  %{
    "title" => "Elixir/PhoenixアプリをGitHub ActionsでGigalixirに継続的デプロイする",
    "url" => "https://qiita.com/mokichi/items/efe4e87763bfdf589d28"
  },
  %{
    "title" => "clubhouseを用いた画像の送受信",
    "url" => "https://qiita.com/ELIXIR/items/01e4a4336243c8195a6e"
  },
  %{
    "title" => "Microsoft Ignite Keynoteとtogetherしようぜ with Elixir",
    "url" => "https://qiita.com/torifukukaiou/items/64616a2999f8628a10ed"
  },
  %{
    "title" => "Nx,Exla GPUをdockerでビルドしbenchを回してみた",
    "url" => "https://qiita.com/the_haigo/items/d1d1b62bfb9fd2013c17"
  },
  %{
    "title" => "[Arduino]短間隔におけるdeep sleepの有効性",
    "url" => "https://qiita.com/ELIXIR/items/a38337ea83ddc318e8ad"
  },
  %{
    "title" => "Nxで始めるゼロから作るディープラーニング  Nx.Defn.Kernel.gradを読む",
    "url" => "https://qiita.com/the_haigo/items/593926922a1d72591c3d"
  },
  %{
    "title" => "PlatformIOでRaspberry Pi Pico を動かす（Windows,Arduinoフレームワーク）",
    "url" => "https://qiita.com/ELIXIR/items/8a7a24f6aa64972ec819"
  },
  %{
    "title" => "Phoenixで Error: Node Sass does not yet support your current environmentになった話",
    "url" => "https://qiita.com/daiki04752/items/208dc5e44ee6a0349368"
  },
  %{
    "title" => "Nxで始めるゼロから作るディープラーニング 5章誤差逆伝播法",
    "url" => "https://qiita.com/the_haigo/items/f273a9c687302507d79d"
  },
  %{
    "title" => "paiza.IO の API を優しく触ってみる",
    "url" => "https://qiita.com/Gart/items/9ed028ffecdbf9ecaf2a"
  }
]
```

# Hexたちはどこにインストールされたの?
- https://github.com/elixir-lang/elixir/blob/fe4d5468a1ca4b5699802aecc568e178bd4219ed/lib/mix/lib/mix.ex#L538-L540
- 環境変数`MIX_INSTALL_DIR`で設定された場所か、`Path.join(Mix.Utils.mix_cache(), "installs")`です
- `Path.join(Mix.Utils.mix_cache(), "installs")`を評価すると、macOSの場合
    - `/Users/<username>/Library/Caches/mix/installs`
    - でした

```elixir
    installs_root =
      System.get_env("MIX_INSTALL_DIR") ||
        Path.join(Mix.Utils.mix_cache(), "installs")
```

# Wrapping up :lgtm::lgtm::lgtm::lgtm:
- Elixir 1.12の正式リリースが待ち遠しいですね
    - I can't wait.
- Enjoy [Elixir](https://elixir-lang.org/) :bangbang::bangbang::bangbang:

[^1]: まあ、本格的に何かを作る時には`mix new`するものなので、気にはしてなかったのですが、[Mix.install/2](https://hexdocs.pm/mix/1.12.0-rc.0/Mix.html#install/2)なんてものがでると聞くと、ただちょっとHTTP GETしたいだけなのに面倒だなあ〜　とちょっぴりおもうようになってしまいました。記事をわかりやすくするために「面倒くさい」なんて書いてしまいましたが、言葉の綾です。