在Windows上的Elixir Distillery发行版中自动预启动运行迁移

在Windows上的Elixir Distillery发行版中自动预启动运行迁移,windows,batch-file,elixir,database-migration,distillery,Windows,Batch File,Elixir,Database Migration,Distillery,我需要你的帮助! 我正在尝试在蒸馏厂版本(Elixir应用程序)中运行迁移,然后应用程序自动启动(通过引导挂钩-)。 开发和生产平台必须是Windows 问题:我找不到有关Windows(.bat)的任何信息-脚本引用了该问题-我搜索“pre_start.bat”文件的脚本-用于调用ERTS节点,最后是其中的Elixir代码 我的酿酒厂配置:rel\config.exs environment :prod do ... set pre_start_hook: "rel/hooks/pre

我需要你的帮助! 我正在尝试在蒸馏厂版本(Elixir应用程序)中运行迁移,然后应用程序自动启动(通过引导挂钩-)。 开发和生产平台必须是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”函数的我的代码 我怎样才能做到这一点

下面的代码是我到目前为止得到的。。但是它不起作用

@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
@echo关闭
回显运行迁移
回声。
回声。
回声。
cd%发布\根目录\目录%
@set system_erl=“\erts-9.1\bin\erl.exe”
@设置erl=%system\u erl%
@设置system\u root\u dir\u cmd=%system\u erl%-noshell-eval“io:format(\“~s\”,[filename:nativename(code:root\u dir())])。”-s初始停止
@set rootdir=%system\u root%
@设置system\u erts\u vsn\u cmd=%system\u erl%-noshell-eval“Ver=erlang:system\u info(version),io:format(\“~s\”,[Ver])”-s初始停止
@设置erts\U vsn=%system\U erts\U vsn%
@设置erts\U dir=%rootdir%\erts-%erts\U vsn%
@设置rel_name=“my_api”
@设置rel_vsn=“1.0”
@设置合并的\u目录=%rootdir%\lib\%rel\u name%-%rel\u vsn%\consolidated
@%erl%-引导变量ERTS\U LIB\U DIR“%ERTS\U DIR%\..\LIB”^
-隐藏-无外壳-启动\u清洁^
-pa“%合并目录%”^
-s“Elixir.MyApp.ReleaseTasks”“种子”-s初始停止
回显迁移成功运行
如果我完全错了,请纠正我。
感谢您的帮助!顺便说一句,这是一个phoenix应用程序。

我会选择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
也将构建此可执行文件,因此您可以在运行
distrillery

之前使用它并对其进行测试。是否有任何理由为此使用
.bat
文件?我将生成运行此特定函数的erlang本机
escript
,并将其用作
pre_start
。您不需要在所有代码行前面使用
@
符号。一旦您声明了
@echo off
,就不再需要它们来抑制冗长的输出了。@mudasobwa您能大致解释一下怎么做吗?谢谢@Squashman感谢您提供的信息在您的代码中,您有以下似乎没有已知值的变量,
%RELEASE\u ROOT\u DIR%
%system\u ROOT%
%system\u erts\u vsn%
。这意味着您的变量,
%rootdir%
%erts\u vsn%
也将没有值,并且以下变量将不具有预期的内容
%erts\u dir%
%consolidated\u dir%
。此外,您还设置了
%erl%
,因为它的内容与
%system\u erl%
相匹配,并且永不更改,
%system\u root\u dir\u cmd%
%system\u erts\u vsn\u cmd%
似乎都未使用。此外,当您使用
set
时,正确的语法是
set“Var=Value”
⇓⇓⇓ 文件:~w | bin lib mix.exs README.md |,指向MyApp.Mixfile.package返回的数组/0我不确定如何更好地表达自己。将
bin
目录添加到
文件列表中
项目中
mix.exs的功能中。好的,我明白你的意思了。。我都照你说的做了。此外,我还生成了带有“mixe escript.build”的escript。(bin/migrator)现在位于我的项目结构中。当我通过Distillery(mix release--env=prod)构建时,在我的发布文件夹中找不到migrator可执行文件。我错过什么了吗?谢谢你的快速回答!