Elixir Mix 发布 - 如何将额外的文件复制到 Phoenix 应用程序的 tarball 中?

问题描述

我编写了以下 mix.exs 以将我的 Phoenix 应用程序作为焦油球发布,参考 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

当我运行 MIX_ENV=qa mix release my_app 时,它在 seeds 下创建了一个 _build/qa/rel/my_app 目录,但是当我提取生成的 tar 球时,它不包含 seeds 目录。

如何重写 mix.exs 以便将此目录插入 tar 球?

Elixir 版本是 1.11.3。

注意:The same question 已在 Elixir 论坛上发布。

解决方法

您无需手动复制任何内容,因为 elixir 会自动为您执行此操作,如果您查看 my_app/lib/my_app-0.1.0/priv,您的 priv 文件夹中就有所有文件。

现在为了在不硬编码路径的情况下轻松访问这些资源,您可以使用 priv_dir\1:

:code.priv_dir(:my_app)

这不仅适用于您的应用程序,例如如果您想要您的 phoenix 静态资源,您可以在 phoenix priv 文件夹中找到它们。

,

查看 mix.releasesource,它似乎只在编译发布时从特定目录中进行选择。

如果您将 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...