在Windows上的Elixir Distillery发行版中自动预启动运行迁移
我需要你的帮助! 我正在尝试在蒸馏厂版本(Elixir应用程序)中运行迁移,然后应用程序自动启动(通过引导挂钩-)。 开发和生产平台必须是Windows 问题:我找不到有关Windows(.bat)的任何信息-脚本引用了该问题-我搜索“pre_start.bat”文件的脚本-用于调用ERTS节点,最后是其中的Elixir代码 我的酿酒厂配置:rel\config.exs在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
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可执行文件。我错过什么了吗?谢谢你的快速回答!