備忘録

働きたくないでござる

phx.new のオプションについて

Rails では細かくオプションを指定してプロジェクト作成することができますが、 Phoenix Framework でもいくつかのオプションがあるようです。
最新の v1.3 のオプションについて記載されている記事が見当たらなかったのでまとめてみたいと思います。

公式のドキュメントについて

phx.new に関するドキュメントは、私が見た限りでは Hexdocs のこのページぐらいかなと思います。(他にあったら教えてください!)
Installation – Phoenix v1.3.0

phx.new/lib/mix/tasks に配置されていないので Hexdocs のサイドバーの MIX TASKS にはドキュメントがありません。
プログラム本体はここらへんにあるようなのでこのコードを読みながら記事を書いていきたいと思います。 https://github.com/phoenixframework/phoenix/tree/master/installer/lib

コマンド

phx.new

普通に Phoenix プロジェクトを作成するコマンドです。 Ecto も Web も両方インストールされます。
Umbrella プロジェクトではなく、単体で動作させるプロジェクトを作るときに使うコマンドですね。(もちろん、 Umbrella 下でも使えます。)

phx.new.ecto

Umbrella プロジェクト下での モデル用 Phoenix プロジェクトを作成するコマンドです。 mix phx.new PROJECT_NAME --no-brunch --ecto コマンドとやってることは同じようですが、Umbrella プロジェクトでないと使用できない点に注意する必要があります。

phx.new.web

Umbrella プロジェクト下での Web 用 Phoenix プロジェクトを作成するコマンドです。 Umbrella プロジェクトじゃないと使えないようです。

オプション

ぶっちゃけここのコメントに書いてあることが全てです。
https://github.com/phoenixframework/phoenix/blob/master/installer/lib/mix/tasks/phx.new.ex

--umbrella

Umbrella プロジェクトとして Phoenix プロジェクトを作成します。
具体的には、モデル(ドメイン)用のプロジェクトと、 Web用のプロジェクトの2つを作ります。
mix phx.new hello --umbrella と実行した場合、以下のように作られます。

hello_umbrella/   Hello.Umbrella
  apps/
    hello/        Hello
    hello_web/    HelloWeb

--app

OTP アプリケーション名を指定できます。
--module と似ていますが、 --module はファイル名はアプリケーション名でモジュール名が指定された値になるのに対し、 --app はファイル名もモジュール名も指定された値になります。
--app はダウンケース・スネークケースで指定する必要があります。
この説明だけだとわかりにくいですが、実行するとこうなります。

$ mix phx.new sample_app --app hoge_app
...
* creating sample_app/lib/hoge_app.ex
...

sample_app/lib/hoge_app.ex

defmodule HogeApp do
end

--module

モジュール名やモジュールの接頭辞を指定できます。
--module はキャメールケースで指定する必要があります。
実行するとこうなります。

$ mix phx.new sample_app2 --module HogeApp2
...
* creating sample_app2/lib/sample_app2.ex
...

sample_app2/lib/sample_app2.ex

defmodule HogeApp2 do
end

--app と違ってファイル名とモジュール名が異なってしまうので、 --app になにかトラップめいたものがなければ使わないほうがわかりやすいかなと思っています。

--database

使用する RDB を指定することができます。
デフォルトは PostgreSQL で、他には MySQLMicrosoft SQL Server, SQLite, MongoDB などを指定できます。

Ecto – Phoenix v1.3.0

--no-brunch

Phoenix ではフロントエンドのビルドツールとして Brunch をインストールしますが、このオプションで除外することができます。 API サーバーや Brunch 以外のビルドツールを使用したい場合に便利ですね。

--no-ecto

Ecto を除外することができます。
phx.new.ecto--ecto のオプションと書きましたが、 --ecto なんてオプションについて記載されていません。
これは phx.new.ecto --no-ecto と矛盾したコマンドを実行されたときに上書きするためのオプションではないかなと思います。(未検証)

--no-html

静的 HTML の生成を除外できます。
ちなみに --no-brunch だと静的ファイルがビルドされないので表示崩れするのではないかなと思ったのですが、そこらへん上手くやっているようですね。 https://github.com/phoenixframework/phoenix/blob/v1.3.0/installer/lib/phx_new/web.ex#L88

--binary-id

Ecto で使用するデータベースのプライマリキーを id 以外のものにしていいできるらしいです。
あまり興味ないので調べてもいないし検証もしてません。

phx.gen.* とオプションの関係について

phx.gen.* では Ecto に依存したコンテキストファイルを作成するため、 --no-ecto オプションを使用すると期待通りの動作をしなくなる場合があるらしいです。 この問題を回避するためには、 phx.gen.* コマンド実行時に --no-context オプションを指定することでコンテキストファイルの作成をスキップできます。 同様に --no-html でも重要な HTML コンポーネントが生成されないので phx.gen.html コマンドが壊れる可能性があるようです。

所感

コメントの劣化和訳のようになってしまいましたが、間違い等あれば教えてください!!!