Выпуск Elixir Mix - Как мне скопировать дополнительные файлы в архив приложения Phoenix?

Я написал следующий файл mix.exs, чтобы выпустить мое приложение Phoenix как tar-шар, ссылаясь на раздел «Шаги» Mix.Tasks.Release документация.

defmodule MyApp.MixProject do
  use Mix.Project

  def project do
    [
      apps_path: "apps",
      apps: [:shared, :admin, :shop],
      version: "0.1.0",
      start_permanent: Mix.env() in [:qa, :prod],
      deps: deps(),
      releases: [
        my_app: [
          applications: [
            admin: :permanent,
            shop: :permanent
          ],
          steps: [:assemble, &copy_extra_files/1, :tar]
        ]
      ],
      default_release: :my_app
    ]
  end

  defp copy_extra_files(release) do
    File.cp_r("apps/shared/priv/repo/seeds", release.path <> "/seeds")
    release
  end

  defp deps do
    []
  end
end

Когда я запускаю MIX_ENV=qa mix release my_app, он создает каталог seeds в _build/qa/rel/my_app, но когда я извлекаю сгенерированный tar-шар, он не содержит каталог seeds.

Как я могу переписать mix.exs, чтобы вставить этот каталог в tar-шар?

Версия Эликсира - 1.11.3.

Примечание. То же вопрос был размещен на форуме "Эликсир".


person Tsutomu    schedule 18.01.2021    source источник


Ответы (2)


Вам не нужно ничего копировать вручную, так как elixir делает это за вас автоматически. Если вы заглянете в свой my_app/lib/my_app-0.1.0/priv, там у вас будут все файлы, которые были в вашей частной папке.

Теперь для безболезненного доступа к этим ресурсам без жесткого программирования пути вы можете использовать _2 _ :

:code.priv_dir(:my_app)

Это применимо не только для вашего приложения, например, если вам нужны статические ресурсы Phoenix, вы можете найти их в папке phoenix priv.

person Daniel    schedule 18.01.2021
comment
Большое спасибо! Одна нота. Чтобы использовать его в коде Elixir, нам нужно написать что-то вроде List.to_string(:code.priv_dir(:shared)). - person Tsutomu; 18.01.2021

Глядя на source для mix.release, похоже, он выбирает только из определенных каталогов при компиляции выпуска.

Если вы скопируете seeds в #{release.path}/releases/#{release.version}, он будет включен.

defp copy_extra_files(release) do
  File.cp_r(
    "apps/shared/priv/repo/seeds",
    "#{release.path}/releases/#{release.version}/seeds"
  )

  release
end
person Adam Millerchip    schedule 18.01.2021
comment
Из ответа Даниэля очевидно, что это неправильный подход. Но это может быть полезно для копирования файлов, которых нет в каталоге priv/, поэтому я пока оставлю его. - person Adam Millerchip; 18.01.2021