phx.newのオプションの疑問点について答えてみます (Elixir/Phoenix)

# はじめに
- [Elixir](https://elixir-lang.org/)楽しんでいますか:bangbang::bangbang::bangbang:
- 本記事は2021/08/28(土)から開催中の純粋なもくもく会[autoracex #43](https://autoracex.connpass.com/event/223361/)の成果です
- @yamaneko717 さんの「[Phoenixのwebsocket部分のみ使いたい](https://qiita.com/yamaneko717/items/fad83f36f958ceaf9901)」にあげられている疑問に回答してみようとおもいます
    - ちょうど最近、私自身が使ったオプションがありましたので、アウトプットしておこうとおもいます
- もとの記事では[phx.new](https://hexdocs.pm/phoenix/Mix.Tasks.Phx.html#content)タスクのオプションについての疑問を挙げられています
- `mix help phx.new`でオプションを確認できます
- `Phoenix v1.5.12`

# [Phoenixのwebsocket部分のみ使いたい](https://qiita.com/yamaneko717/items/fad83f36f958ceaf9901)
https://qiita.com/yamaneko717/items/fad83f36f958ceaf9901

- こちらの記事で挙げられている疑問点にお答えしていきます

## --umbrella　
> どういうこと？？よくわからん。一つのプロジェクト内に複数アプリ作るってことぉ？？

- あっています。
- [Elixir School](https://elixirschool.com/en/)の[Umbrella Projects](https://elixirschool.com/en/lessons/advanced/umbrella-projects/)がわかりやすいとおもいます
    - [日本語訳](https://elixirschool.com/ja/lessons/advanced/umbrella-projects/)

## --app

> OTPアプリケーションって何？ｗ
> ググったらワンタイムパスワードとかでてきたけどｗ
> だれか教えてください。

- Open Telecom Platformの略です
- [Introduction to Mix](https://hexdocs.pm/phoenix/installation.html#content)には以下の説明がかいてあります
    - OTP (Open Telecom Platform) is a set of libraries that ships with Erlang. Erlang developers use OTP to build robust, fault-tolerant applications. In this chapter we will explore how many aspects from OTP integrate with Elixir, including supervision trees, event managers and more;
- 参考: [16. OTPとは何か？](https://www.ymotongpoo.com/works/lyse-ja/ja/16_what_is_otp.html)

### 例
```
$ mix phx.new hoge --app fuga
```

- のように[Phoenix](https://www.phoenixframework.org/)プロジェクトをつくると、`config/config.exs`内のOTPアプリケーション名が`:fuga`になります
    - 逆に`--app fuga`を指定しない場合には、`:hoge`になります
- `lib/fuga.ex`や`lib/fuga_web.ex`が生成されていて、モジュール名が`Fuga`、`FugaWeb`になっています
    - 逆に`--app fuga`を指定しない場合には、`lib/hoge.ex`や`lib/hoge_web.ex`が生成されていて、モジュール名が`Hoge`、`HogeWeb`になっています


## --module

> Google翻訳 -> 「生成されたスケルトンの基本モジュールの名前」
> ちょっとなにいってるかわからない。

### 例
```
$ mix phx.new hoge --module Fuga
```
- のように[Phoenix](https://www.phoenixframework.org/)プロジェクトをつくると、`lib/hoge.ex`や`lib/hoge_web.ex`のモジュール名が`Fuga`や`FugaWeb`になっています
    - 逆に`--module Fuga`を指定しない場合には、`Hoge`や`HogeWeb`になります

### さらに例
- 私は以下の場面で、`--app`、`--module`を指定したことがあります
- 手前味噌の「[Phoenixの開発環境をつくる(Elixir)](https://qiita.com/torifukukaiou/items/5b90b038f38ce18c0256)」にして環境構築した場合に、`.devcontainer`と同じ階層に[Phoenix](https://www.phoenixframework.org/)プロジェクトの関連フォルダやファイルを置きたかったのです
- どういうことなのか説明を続けます
- 初期状態はこんな感じです

```
/workspace
├── .devcontainer
│   ├── Dockerfile
│   ├── devcontainer.json
│   └── docker-compose.yml     
```

- こんな構成になっていて、`workspace`の直下に[Phoenixのwebsocket部分のみ使いたい](https://qiita.com/yamaneko717/items/fad83f36f958ceaf9901)のフォルダやプロジェクトを作りたいとします

```
% pwd
workspace
% mix phx.new .
```

- と実行すると、OTPアプリ名が`:workspace`になって、`Workspace`モジュールや`WorkspaceWeb`モジュールがつくられます
- それが嫌だとして例えば、OTPアプリ名を`:hacobune_phx`に、`HacobunePhx`モジュールや`HacobunePhxWeb`モジュールを作りたいとします
    - [Hacobuneにデータベースを使うPhoenix Chatアプリをデプロイする(Elixir)](https://qiita.com/torifukukaiou/items/e45406000046638fb9a8)

```
% mix phx.new . --module HacobunePhx --app hacobune_phx
```

- こんな感じで実行することで以下のようなプロジェクトができあがりました


```
/workspace
├── .devcontainer
│   ├── Dockerfile
│   ├── devcontainer.json
│   └── docker-compose.yml 
├── README.md
├── assets
│   ├── css
├── config
│   ├── config.exs
│   ├── dev.exs
│   ├── prod.exs
│   ├── prod.secret.exs
│   └── test.exs
├── lib
│   ├── hacobune_phx
│   ├── hacobune_phx.ex
│   ├── hacobune_phx_web
│   └── hacobune_phx_web.ex
├── mix.exs
├── priv
└── test
```

# --verbose

> なにこれｗ
> デバッグに使えるの？

- はじめて使ってみました
- ソースコードはこのへんのようです
    - https://github.com/phoenixframework/phoenix/blob/v1.5.12/installer/lib/mix/tasks/phx.new.ex#L314-L320
- つけたときとつけなかったときの違いがいまいちつかめませんでしたが、ご推察の通り、トラブルシュートや[phx.new](https://hexdocs.pm/phoenix/Mix.Tasks.Phx.html#content)タスクそのものの開発でデバッグに使うのだとおもいます

# Wrapping Up :lgtm::lgtm::lgtm::lgtm::lgtm:
- Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
- `mix phx.new . --module HacobunePhx --app hacobune_phx`の話を書こう書こうとおもっていて書いていなかったので疑問に答える形で書くことができてよかったです :relaxed: 
- [Elixir](https://elixir-lang.org/)の純粋なもくもく会 [autoracex #43](https://autoracex.connpass.com/event/223361/) ただいま**開催中**:rocket::rocket::rocket: