Запуск экто-миграции через выпуск из ликеро-водочного завода

У меня есть приложение эликсира с 3 зонтичными проектами. Я создаю его двоичный файл (выпуск) через винокурню.

Выполнение этой команды создает файл.tar.gz в _build/prod/rel/se/ Releases / 0.1.0:

MIX_ENV = выпуск Prod Mix --env= Qa

И я могу извлечь и запустить приложение. Чтобы запустить ecto-миграцию, я добавил этот модуль для задач выпуска [следуя https://hexdocs.pm/distillery/running-migrations.html ]:

defmodule Se.ReleaseTasks do

  @start_apps [
    :postgrex,
    :ecto
  ]

  def myapp, do: Application.get_application(__MODULE__)

  def repos, do: Application.get_env(myapp(), :ecto_repos, [])

  def seed() do
    me = myapp()

    IO.puts "Loading #{me}.."
    # Load the code for myapp, but don't start it
    :ok = Application.load(me)

    IO.puts "Starting dependencies.."
    # Start apps necessary for executing migrations
    Enum.each(@start_apps, &Application.ensure_all_started/1)

    # Start the Repo(s) for myapp
    IO.puts "Starting repos.."
    Enum.each(repos(), &(&1.start_link(pool_size: 1)))

    # Run migrations
    migrate()

    # Run seed script
    Enum.each(repos(), &run_seeds_for/1)

    # Signal shutdown
    IO.puts "Success!"
    :init.stop()
  end

  def migrate, do: Enum.each(repos(), &run_migrations_for/1)

  def priv_dir(app), do: "#{:code.priv_dir(app)}"

  defp run_migrations_for(repo) do
    app = Keyword.get(repo.config, :otp_app)
    IO.puts "Running migrations for #{app}"
    Ecto.Migrator.run(repo, migrations_path(repo), :up, all: true)
  end

  def run_seeds_for(repo) do
    # Run the seed script if it exists
    seed_script = seeds_path(repo)
    if File.exists?(seed_script) do
      IO.puts "Running seed script.."
      Code.eval_file(seed_script)
    end
  end

  def migrations_path(repo), do: priv_path_for(repo, "migrations")

  def seeds_path(repo), do: priv_path_for(repo, "seeds.exs")

  def priv_path_for(repo, filename) do
    app = Keyword.get(repo.config, :otp_app)
    repo_underscore = repo |> Module.split |> List.last |> Macro.underscore
    Path.join([priv_dir(app), repo_underscore, filename])
  end
end

Приложение запускается и компилируется с помощью этого кода, расположенного в одном из зонтичных проектов, где нам требуется миграция. После компиляции и запуска сервера, когда я пытаюсь запустить его через:

команда bin/se_cloud Elixir.Se.ReleaseTasks seed

Я получаю эту ошибку:

Elixir.Se.ReleaseTasks.seed либо не определен, либо имеет ненулевую арность

Кто-нибудь еще сталкивался с этой проблемой? Или я что-то здесь неправильно настраиваю?

1 ответ

Вместо запуска команды непосредственно в терминале, поместите ее в файл сценария в rel/commands/migrate.sh:

#!/bin/sh

$RELEASE_ROOT_DIR/bin/se command Elixir.Se.ReleaseTasks seed

Затем зарегистрируйте вашу пользовательскую команду в конфигурации выпуска:

release :se do
  ...
  set commands: [
    "migrate": "rel/commands/migrate.sh"
  ]
end

Теперь вы должны иметь возможность запустить его с:

bin/se migrate

Se.ReleaseTasks Модуль должен положить в папку lib, что mix может скомпилировать его. Для зонтичного проекта вы можете следовать приведенной ниже структуре кода:

project
 - apps
   - api-app
     - lib
       - Release.ex
   - ecto-app
 - rel

Вот пример.

Другие вопросы по тегам