17
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ElixirAdvent Calendar 2022

Day 20

簡単Elixirシリーズ ~ カスタムmixコマンドを作ろう ~

Last updated at Posted at 2022-12-19

簡単Elixirシリーズ

~ カスタムmixコマンドを作ろう ~

この記事は「Elixir Advent Calendar 2022」20日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

今回は、とあるフォルダ配下にあるファイルやフォルダ名を取得してリスト化したい。という小ネタ(そう、この記事はサクッとがコンセプトW)

まずは下準備

まずはプロジェクトを作成する

$ mix new dockerex

生成されたプロジェクトのdockerex.exにまずはdockerfileを生成する関数を作ります。
今回は簡単なものにしたいので、固定の値をただ出力する関数として作りました。

lib/dockerex.ex
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を作ります。

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コマンドつくって遊んでみてください。

17
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?