Search code examples
elixirphoenix-frameworkelixir-mix

Elixir Mix release - How can I copy extra files into the tarball of Phoenix app?


I wrote the following mix.exs to release my Phoenix application as a tar ball, referring to the “Steps” section of the Mix.Tasks.Release documentation.

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

When I run MIX_ENV=qa mix release my_app, it created a seeds directory under _build/qa/rel/my_app, but when I extract the generated tar ball, it does not contain the seeds directory.

How can I rewrite the mix.exs in order to insert this directory into the tar ball?

Elixir version is 1.11.3.

Note: The same question has been posted on the Elixir Forum.


Solution

  • You don't have to copy anything manually since elixir does this for you automatically, if you take a look in your my_app/lib/my_app-0.1.0/priv, there you have all the files you had in your priv folder.

    Now in order to access those resources painless without hardcoding the path you can use priv_dir\1:

    :code.priv_dir(:my_app)
    

    This is applicable not only for your application, for example if you want your phoenix static resources, you can find them in phoenix priv folder.