Как создать Mix Mix для генерации файлов - PullRequest
0 голосов
/ 10 июля 2019

Как мне создать пользовательскую задачу микширования для динамического генерирования кода и файлов, аналогично тому, как это делает Phoenix.Например, в Phoenix есть генераторы типа mix phx.gen.html, которые будут динамически добавлять несколько файлов в lib.Я не пытаюсь сделать что-то сложное, просто пытаюсь понять, как динамически генерировать код.Например, как мне создать смешанную задачу для создания файла с именем user.ex с этим кодом.

defmodule User do

 def function1(arg), do: arg
 def function2(arg), do: arg

end

1 Ответ

2 голосов
/ 10 июля 2019

foo = your_app_name

Foo / Библиотека / Foo / микс / задачи / create_file.ex:

defmodule Mix.Tasks.CreateFile do
  use Mix.Task

  def run([file_name]) do
    app_dir = File.cwd!
    app_name = Path.basename(app_dir)
    new_file_path = Path.join(
        [app_dir, "lib", app_name, "#{file_name}.ex"]
    )

    File.write(
      new_file_path, 
      """
      defmodule #{String.capitalize(app_name)}.#{String.capitalize(file_name)} do
        def hello do
        end

        def goodbye do
        end
      end
      """, 
      [:write]
    )
  end

end

Если вы запускаете задачу смешивания:

~/phoenix_apps/foo$ mix create_file skeleton

["skeleton"] будет передано в качестве аргумента run(), и задача создаст файл:

foo/lib/foo/skeleton.ex

с содержанием:

defmodule Foo.Skeleton do
  def hello do
  end

  def goodbye do
  end
end
...