Elixirのチートシートを作ろう #17 mixその1

# 1.OverView

さて、mixです。
ポエム全開で、主語デカく決めつけます。

MixはElixirのビルドツールであり、プロジェクトの作成、依存関係の管理、テストの実行、ドキュメントの生成など、さまざまなタスクを簡単に実行するためのツールです。

ビルドツールこそが、僕の愛する古き良き時代のプログラミング言語と、今の言語を分ける点だと思ってます。
言い換えれば、BASICで、BAKAとかループで回してはしゃいでた僕には、REPLはすごくわかりやすく、ビルドツールを理解しないと
コンパイルすら出来ないモダンな言語は、ものすっごい大変ですｗ

と言うわけで、何度も書き直すから、今日は勉強の成果を見てやる、くらいにしてくれると嬉しいです。

今回、ステップバイステップでやりますね。
今回、テストを抜いた、プロジェクト作成、コンパイル、実行の流れをやります。


# 2. まずは解説

## 2.1 作業の流れ

プログラムを書くとはなにか？みたいなお説教はおいておいて。

「プログラムを書いて、実行する」

くらいのイメージはロートルの僕にも、みなさんにもありますね。

ここで「プログラムを書いて」の部分が、今の言語はちょっと違う。
プログラムを動かすための、いろんなファイルを作ってくれるのです。

流れは以下の通り

1. プロジェクトを作成する。
2. プロジェクトに、ファイルを更新・作成する
3. コンパイルする
4. 実行する。

ほおら、話がややっこしくなってきたｗ
なお、ここらへん、全部mixコマンドがやってくれるので、わしらがやることはそれに従う事です。

## 2.2 プロジェクトを作成する。/mix newコマンド

https://elixirschool.com/en/lessons/basics/mix#new-projects-0

```
When we’re ready to create a new Elixir project, 
```
かっこいいねぇ、日本語訳もかっこいいぜ
https://elixirschool.com/ja/lessons/basics/mix#%E6%96%B0%E3%81%97%E3%81%84%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88-0


じゃ、実行してみようか？

mix new プロジェクト名

です。
プロジェクト名は後々使うので、　勉強中は覚えやすい名前にしてね。ニュルンベルクのマイスタージンガー作戦とか言っても困るよ。


```
(base) C:\Users\nanbu>mix new example
* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/example.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd example
    mix test

Run "mix help" for more commands.

````

さて、いろんなファイルが出来ましたね。
あとで、creating testとか、解説しようと思いますが、今は、どんなファイルが出来たか、見てみましょう。


```
(base) C:\Users\nanbu\example>dir /R /S
 Volume in drive C has no label.
 Volume Serial Number is 6680-2753

 Directory of C:\Users\nanbu\example

2024/12/20  21:24    <DIR>          .
2024/12/20  21:24    <DIR>          ..
2024/12/20  21:24                97 .formatter.exs
2024/12/20  21:24               629 .gitignore
2024/12/20  21:24    <DIR>          lib
2024/12/20  21:24               572 mix.exs
2024/12/20  21:24               469 README.md
2024/12/20  21:24    <DIR>          test
               4 File(s)          1,767 bytes

 Directory of C:\Users\nanbu\example\lib

2024/12/20  21:24    <DIR>          .
2024/12/20  21:24    <DIR>          ..
2024/12/20  21:24               201 example.ex
               1 File(s)            201 bytes

 Directory of C:\Users\nanbu\example\test

2024/12/20  21:24    <DIR>          .
2024/12/20  21:24    <DIR>          ..
2024/12/20  21:24               138 example_test.exs
2024/12/20  21:24                15 test_helper.exs
               2 File(s)            153 bytes

     Total Files Listed:
               7 File(s)          2,121 bytes
               8 Dir(s)  31,588,274,176 bytes free

```
```

これらのファイルを弄って、準備を進めていきます。
まずは、「たくさんファイルが出来たなー」って思ってくれます？

## 2.3 依存関係を設定する。

タイトルにいきなり、変な言葉を使って申し訳ない。後で思い知るので、ここはスキップ。

一言覚えて。

「プロジェクトが使うライブラリなどの依存関係はmix.exsで編集する」

…それじゃ、次のセクションで。

…見てる？うん、こっから解説の次回予告なのだ。

最初に見える項目は project です。ここでアプリケーションの名前(app)を定義し、そのバージョン(version)と用いるElixirのバージョン(elixir)と、最後に依存関係(deps)を記述します。

application の項は、次項で扱うアプリケーションファイルの生成時に使用します。
```
  def project do
    [
      app: :example,
      version: "0.1.0",
      elixir: "~> 1.15",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end
```

ここで、依存関係が提起されております。
いろんなライブラリを使う時、ここで依存関係を定義します。

今回は、あえてスキップしましょう。次回、「依存関係を管理する」と一緒にやります。
https://elixirschool.com/ja/lessons/basics/mix#%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-3

## 2.3 ソースを編集

まずは、プログラムを更新しましょう。
 
前回、プロジェクトのファイルは、以下のディレクトリに出来ました。

 C:\Users\nanbu\example

この下のlibディレクトリにある、example.exを弄っていきます。

```
(base) C:\Users\nanbu>tree /F example
Folder PATH listing
Volume serial number is 6680-2753
C:\USERS\NANBU\EXAMPLE
│   .formatter.exs
│   .gitignore
│   mix.exs
│   README.md
│
├───lib
│       example.ex　<-ここを弄るよー
│
└───test
        example_test.exs
        test_helper.exs


```

何をやってるんだかわからん？
Windowsだしなぁ。Mac版とかLinux版とかの解説が欲しい人は、延々と書くぞｗ

example.exを弄ります。.\lib\example.exを開いてください。

…defmodule Example doとかあるけど、Example.hello/0って関数があることだけ、今は確認しましょう。
```
defmodule Example do
  @moduledoc """
  Documentation for `Example`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> Example.hello()
      :world

  """
  def hello do
    :world
  end
end

```



# 2.4 コンパイル

まだコンパイルかよ！コンパイルなんだよ！
mix compileコマンドを使用します。

```
(base) C:\Users\nanbu\example>mix compile

(base) C:\Users\nanbu\example>
```
そりゃ、サンプルなんだから、コンパイル出来なきゃ困るよねぇ。

# 2.5 実行してみようか？

```
(base) C:\Users\nanbu\example>mix run
```

何も表示されないですね？しめしめ。
そりゃそうだよね、def moduleしかしてないですもん、僕ら

上記の.\lib\example.exの末尾に、一行足してみましょう。
```
Example.hello()
```

では、再実行。
```
(base) C:\Users\nanbu\example>mix run
Compiling 1 file (.ex)
world
```

`Compiling 1 file (.ex)`と表示されてるのがわかるでしょうか?
mixコマンドは.\lib\example.exの変更を検知し、compileしてから実行してくれているわけですね。
いやぁ、すげぇな。

では、本日はこの辺で。

# 3. 本日のチートシート

|項目|説明|例|
|:--------|:----------------------------------------|:------------------------------------------------------------------|
|プロジェクトの作成|mixで、プロジェクトを作成する|mix new example|
|依存関係の設定| mixが作成したプロジェクトの中のmix.exsファイルを編集し、依存関係を設定する|T.B.S|
|コンパイル|プロジェクトのファイルをコンパイルし、実行形式を生成する|mix compile|
|プログラムの実行|mixを使ってプロジェクトの実行形式を実行する|mix rum|