簡単Elixirシリーズ
~ カスタムmixコマンドを作ろう ~
この記事は「Elixir Advent Calendar 2022」20日目の記事です
東京にいるけどfukuokaexのYOSUKEです。
簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。
今回は、とあるフォルダ配下にあるファイルやフォルダ名を取得してリスト化したい。という小ネタ(そう、この記事はサクッとがコンセプトW)
まずは下準備
まずはプロジェクトを作成する
$ mix new dockerex
生成されたプロジェクトのdockerex.ex
にまずはdockerfileを生成する関数を作ります。
今回は簡単なものにしたいので、固定の値をただ出力する関数として作りました。
defmodule Dockerex do
@moduledoc """
Documentation for `Dockerex`.
"""
@doc """
Create a dockerfile for the Phoenixframework.
```
FROM elixir:1.12.3
RUN apt-get update && apt-get install -y \
inotify-tools git npm && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN mix do \
local.hex --force, \
local.reber --force, \
archive.install --force hex phx.new 1.6.6
```
## Examples
iex> Dockerex.create
:ok
"""
def create do
write(build())
end
defp build() do
"""
FROM elixir:1.12.3
RUN apt-get update && apt-get install -y \\
inotify-tools git npm && \\
apt-get clean && \\
rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN mix do \\
local.hex --force, \\
local.reber --force, \\
archive.install --force hex phx.new 1.6.6
"""
end
defp write(contents) do
path = case File.cwd do
{:ok, path} -> path
_ -> "Error"
end
Path.join([path, "Dockerfile"])
|> File.write(contents,[:append])
end
end
カスタム mix コマンドの作成
mix カスタムコマンドの作成は実は超絶簡単です。今回は、mix dockerex
と言うコマンドを叩くとDockerfile
が生成されるイメージして作成します。
下準備として、lib/
配下に新しいフォルダを作ります。
lib/mix/tasks/
そして、このフォルダ配下に mix コマンド名 となるモジュールを作成します。
今回は、dockerexとコマンド打ちたいので、lib/mix/tasks/dockerex.ex
を作ります。
defmodule Mix.Tasks.Dockerex do
@moduledoc "The Dockerfile Create mix task: `mix help dokcerex`"
use Mix.Task
@shortdoc "Simply calls the Dockerex.create/0 function."
def run(_) do
Dockerex.create()
end
end
@moduledoc に記載した内容は、mix help dockerex
で内容が表示されるようになります。
@shortdocを記述することで、mix helpをした際に内容が表示されるようになります。
@shortdoc "Simply calls the Dockerex.create/0 function."
$ mix help dockerex
mix help dockerex
mix dockerex
The Dockerfile Create mix task: mix help dokcerex
$ mix help
mix dockerex # Simply calls the Dockerex.create/0 function.
また、Mix Taskコマンドにするためにuse Mix.Task
を利用します。
そして、今回は簡単にするために、全ての引数を無視するrun関数を作成します。
この関数の中では、 Dockerex モジュールの create 関数を呼び出しています。
これで、準備は完了です。
早速、実行してみましょう。
$ mix dockerex
プロジェクトディレクトリである、dockerex
直下にDockerfile
が生成されていたら成功です。
簡単ですね。皆さんもオレオレ mix taskコマンドつくって遊んでみてください。