【问题标题】:Running Migrations Automatically pre_start in Elixir-Distillery-Release on Windows在 Windows 上的 Elixir-Distillery-Release 中自动运行迁移 pre_start
【发布时间】:2018-04-22 14:16:33
【问题描述】:

我需要你的帮助! 我试图在应用程序自动启动之前(通过 Boot Hooks -https://hexdocs.pm/distillery/boot-hooks.html#content)在酒厂版本(Elixir-Application)中运行迁移。 开发和生产平台必须是 Windows。

问题:我找不到有关 Windows (.bat) 的任何信息 - 引用该问题的脚本 - 我搜索“pre_start.bat”文件的脚本 - 用于调用 ERTS 节点,最后是我的 Elixir 代码它。

我的酿酒厂配置:rel\config.exs

environment :prod do
  ...
  set pre_start_hook: "rel/hooks/pre_start"
  ...
end

所需的脚本应该调用我的代码“Elixir.MyApp.ReleaseTask.migrate”-Function 我怎样才能做到这一点??

以下代码是我到目前为止所得到的......但它不起作用..

@echo off
echo Running migrations
echo.
echo.
echo.
cd %RELEASE_ROOT_DIR%

@set system_erl="<erl_directory>\erts-9.1\bin\erl.exe"
@set erl=%system_erl%
@set system_root_dir_cmd=%system_erl% -noshell -eval "io:format(\"~s\", [filename:nativename(code:root_dir())])." -s init stop
@set rootdir=%system_root%
@set system_erts_vsn_cmd=%system_erl% -noshell -eval "Ver=erlang:system_info(version),io:format(\"~s\", [Ver])" -s init stop
@set erts_vsn=%system_erts_vsn%
@set erts_dir=%rootdir%\erts-%erts_vsn%

@set rel_name="my_api"
@set rel_vsn="1.0"
@set consolidated_dir=%rootdir%\lib\%rel_name%-%rel_vsn%\consolidated

@%erl% -boot_var ERTS_LIB_DIR "%erts_dir%\..\lib" ^
       -hidden -noshell -boot start_clean ^
       -pa "%consolidated_dir%" ^
       -s "Elixir.MyApp.ReleaseTasks" "seed" -s init stop

echo Migrations run successfully

当我对此完全错误时,请纠正我。 任何帮助表示赞赏!顺便说一句,它是一个凤凰应用程序。

【问题讨论】:

  • 您有什么理由为此使用.bat 文件吗?我会生成一个运行此特定功能的 erlang 原生 escript,并将其用作 pre_start
  • 所有代码行前面都不需要@ 符号。一旦您声明了@echo off,就不再需要它们来抑制详细输出。
  • @mudasobwa 你能大致解释一下怎么做吗?谢谢!
  • @Squashman 感谢您提供信息
  • 在您的代码中,您有以下变量,这些变量似乎没有已知值,%RELEASE_ROOT_DIR%%system_root%%system_erts_vsn%。这意味着您的变量%rootdir%%erts_vsn% 也将没有值,并且以下变量将没有预期的内容%erts_dir%%consolidated_dir%。您还不必要地设置了%erl%,因为它的内容匹配%system_erl%,它永远不会改变,%system_root_dir_cmd%%system_erts_vsn_cmd% 似乎都没有使用。此外,当您使用set 时,正确的语法是Set "Var=Value"

标签: windows batch-file elixir database-migration distillery


【解决方案1】:

我会选择 erlang 的原生 escript。构建它:

1.更新mix.exs,例如添加:

escript: [main_module: MyApp, path: "bin/migrator"]

MyApp.Mixfile.project/0函数返回的数组中,并将bin目录添加到发布中:

#         ⇓⇓⇓
files: ~w|bin lib mix.exs README.md|,

MyApp.Mixfile.package/0返回的数组

2。创建MyApp.main/1函数:

def main(_args) do
  MyApp.ReleaseTasks.migrate
end

你已经准备好了。在版本中,bin/migrator 中的 escript(您在步骤 1 中使用的名称。)

现在您应该可以运行 bin/migrator,因为它是一个普通的旧可执行文件。

旁注:mix compile 也会构建这个可执行文件,因此您可以在使用 distillery 运行之前先试用并测试它。

【讨论】:

  • 将 bin 目录添加到发行版的含义:# ⇓⇓⇓ 文件:~w|bin lib mix.exs README.md|,添加到 MyApp.Mixfile.package/ 返回的数组中0
  • 我不确定如何更好地表达自己。将bin 目录添加到您的mix.exs 文件的project 函数内的files 列表中。
  • 好吧,我明白你的意思了..我做了你说的一切。此外,我使用“mix escript.build”生成了 escript。 (bin/migrator) 现在在我的项目结构中。当我通过 Distillery(混合发布 --env=prod)构建时,我在发布文件夹中找不到迁移器可执行文件。我想念什么吗?感谢您的快速答复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2012-12-21
相关资源
最近更新 更多