Mix.installとmix deps.getの比較

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はMix.installとmix deps.getを比較して学んだことをまとめます。

# 目的
Mix.installの使いどころをmix deps.getとの差分で理解する

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.17.0
Erlang v27.0

# 今回やりたいこと
[前回の記事](https://qiita.com/Alicesky2127/items/5e6cede7664253fdb014)で取得した、Qiitaの記事一覧に対して"Elixir"で検索をかける方法について、Mix.installを使用した方法との差分を理解したい

# 前提
[前回の記事](https://qiita.com/Alicesky2127/items/5e6cede7664253fdb014)の結果が長すぎるため、下記の条件でさらに絞り込みをします。

1. Qiitaの記事一覧に対して"Elixir"で検索をかける(これは前回の記事と同じ)
2. 1.の結果について、記事ごとの"title"と"url"と”tags”だけに絞り込む（←new!）
3. 2.の結果について、先頭5件だけ表示する （←new!）

## 関数を追加
Mixプロジェクト内の関数のパイプに`Enum.map/2`と、`Enum.slice/2`を追加します
```diff_elixir:lib/get_qiita_articles.ex
     "https://qiita.com/api/v2/items?query=elixir"
     |> HTTPoison.get!()
     |> Map.get(:body)
     |> Jason.decode!()
+    |> Enum.map(fn map ->
+      %{
+        "title" => map["title"],
+        "url" => map["url"],
+        "tags" => map["tags"]
+      }
+      |> Enum.slice(0..4)
     end
```

iexを起動します
```bash:bash
iex -S mix
```
iex上で追加した関数を使用します
```diff_elixir:iex
GetQiitaArticles.index
```
下記のレスポンスが返ってきました
```diff_elixir:iex
[
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "paiza.IO", "versions" => []}
    ],
    "title" => "paiza.ioでelixir その310",
    "url" => "https://qiita.com/ohisama@github/items/765c2f858c09ac7f8f16"
  },
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "CICD", "versions" => []},
      %{"name" => "Livebook", "versions" => []},
      %{"name" => "LivebookTeams", "versions" => []}
    ],
    "title" => "Livebook Teams で超簡単Webアプリ実装＆リリース自動化",
    "url" => "https://qiita.com/RyoWakabayashi/items/8ef32cb58b339291ca5d"
  },
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "初心者向け", "versions" => []},
      %{"name" => "基礎", "versions" => []}
    ],
    "title" => "Phoenix Projectの作成からモーダル経由でのポストの作成と一覧への反映の処理の流れ part2",
    "url" => "https://qiita.com/akiraarika932/items/b6152a213b8e6fb96034"
  },
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "cloudflare", "versions" => []},
      %{"name" => "bedrock", "versions" => []},
      %{"name" => "Livebook", "versions" => []},
      %{"name" => "AIGateway", "versions" => []}
    ],
    "title" => "Elixir Livebook から Cloudflare の AI Gateway 経由で Amazon Bedrock を呼んでみる",
    "url" => "https://qiita.com/RyoWakabayashi/items/92ec17c5c078c2342c02"
  },
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "paiza.IO", "versions" => []}
    ],
    "title" => "paiza.ioでelixir その309",
    "url" => "https://qiita.com/ohisama@github/items/7419f6e680e61626f3d1"
  }
]
```

これと同じ結果を`Mix.install/2`を使用して得たいと思います

# Mix.installとは
- `mix deps.get`せずに依存関係をインストールして実行するMixコマンド 

## (余談)mixとは？
- mixとは、Elixirのビルドツール
- mixコマンドがあることで私はライブラリの依存関係や環境ごとのビルド周りを気にせずコーディングだけに集中できます
- mix helpでmixコマンド一覧が見れます

# 使ってみた
iexを起動します。`mix deps.get`の時と異なりプロジェクト作成はしないので、ディレクトリはiexが起動できさえすればどこでも構いません。
```bash:bash
iex
```
iex上でMix.installを使用します。
```diff_elixir:iex
Mix.install(
  [
    {:httpoison, "~> 2.2"},
    {:jason, "~> 1.4"}
  ]
)
```
HTTPoisonとJasonのインストールと実行がなされました。
```diff_elixir:iex
:ok
```

iex上で「関数を追加」の節と同じ関数をべた書きして実行してみます。
```diff_elixir:iex
     "https://qiita.com/api/v2/items?query=elixir"
     |> HTTPoison.get!()
     |> Map.get(:body)
     |> Jason.decode!()
     |> Enum.map(fn map ->
       %{
         "title" => map["title"],
         "url" => map["url"],
         "tags" => map["tags"]
       }
       |> Enum.slice(0..4)
     end
```
下記のレスポンスが返ってきました。
```diff_elixir:iex
[
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "paiza.IO", "versions" => []}
    ],
    "title" => "paiza.ioでelixir その310",
    "url" => "https://qiita.com/ohisama@github/items/765c2f858c09ac7f8f16"
  },
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "CICD", "versions" => []},
      %{"name" => "Livebook", "versions" => []},
      %{"name" => "LivebookTeams", "versions" => []}
    ],
    "title" => "Livebook Teams で超簡単Webアプリ実装＆リリース自動化",
    "url" => "https://qiita.com/RyoWakabayashi/items/8ef32cb58b339291ca5d"
  },
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "初心者向け", "versions" => []},
      %{"name" => "基礎", "versions" => []}
    ],
    "title" => "Phoenix Projectの作成からモーダル経由でのポストの作成と一覧への反映の処理の流れ part2",
    "url" => "https://qiita.com/akiraarika932/items/b6152a213b8e6fb96034"
  },
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "cloudflare", "versions" => []},
      %{"name" => "bedrock", "versions" => []},
      %{"name" => "Livebook", "versions" => []},
      %{"name" => "AIGateway", "versions" => []}
    ],
    "title" => "Elixir Livebook から Cloudflare の AI Gateway 経由で Amazon Bedrock を呼んでみる",
    "url" => "https://qiita.com/RyoWakabayashi/items/92ec17c5c078c2342c02"
  },
  %{
    "tags" => [
      %{"name" => "Elixir", "versions" => []},
      %{"name" => "paiza.IO", "versions" => []}
    ],
    "title" => "paiza.ioでelixir その309",
    "url" => "https://qiita.com/ohisama@github/items/7419f6e680e61626f3d1"
  }
]
```

念の為比較ツール（Winmerge）を使用してレスポンスを比較します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/c7575ba7-47b5-2bd1-1839-50813d13c801.png)

Mix.installとmix deps.getで同じ結果を得ていることが確認できました(^▽^)/



# まとめ
Mix.installとmix deps.getはライブラリのインストールの実行をするという機能は同じ。
一方で下記の違いがあることが分かりました。

## プロジェクトを作る／作らない
- Mix.installを使用する場合はmix new等でプロジェクトを作成せず、下記いずれかの方法をとります(他にも方法あれば教えていただければ幸いですm(_ _"m)) 
    - iex内に記述する（今回検証した方法はこちら）
    - .exsファイルを作成してファイル内部に記述する
    - Livebookのdependencies and setupブロック部分に記述する
- mix deps.getを使用する場合は下記の方法をとります
    - mix new等でプロジェクトを作成後、mix.exsのdeps関数内に記述し、さらに`mix deps.get`する

# 感想
ライブラリの機能がどんなものかお試しする分には`Mix.install`を使用し、プロジェクト作成をする場合は`mix deps.get`を使用するという使い分けだと理解しました。

なお、今回の記事の執筆にあたって @torifukukaiouさんのこちらの記事を参考にさせていただきました。いつもAwesomeな記事をありがとうございます。

https://qiita.com/torifukukaiou/items/c600b6d496683442c254




# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian


[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！