2017-11-09 13 views
0

당신의 도움이 필요합니다! 응용 프로그램이 자동으로 시작되기 전에 (증분 - https://hexdocs.pm/distillery/boot-hooks.html#content을 통해) 증류소 릴리스 (Elixir-Application)에서 마이그레이션을 실행하려고합니다. 개발 및 프로덕션 플랫폼은 Windows 여야합니다.자동으로 마이그레이션 실행 Windows에서 Elixir-Distillery-Release의 pre_start

문제점 : Windows (.bat)에 관한 모든 정보를 찾을 수 없습니다. - 문제를 참조하는 스크립트 - "pre_start.bat"파일을 검색합니다. - 파일 - ERTS 노드와 마지막으로 Elixir-Code를 호출합니다. 그 안에.

내 증류소 - 설정 : \ config.exs

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

필요한 스크립트는 α- 함수 은 내가 어떻게 이것을 달성 할 수있는 "Elixir.MyApp.ReleaseTask.migrate"내 코드를 호출해야합니다과 rel? 다음 코드는 필자가 지금까지 가지고 ..하지만 일을 나던 것입니다

..이와 메신저 완전히 잘못된

@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 

저를 수정하십시오. 도움을 주시면 감사하겠습니다. BTW 그것의 피닉스 - 응용 프로그램.

+0

여기에'.bat' 파일을 사용하는 이유가 있습니까? 이 특정 함수를 실행하는 erlang의 네이티브'escript'를 생성하여'pre_start'로 사용합니다. – mudasobwa

+0

모든 코드 줄 앞에'@'기호가 필요하지 않습니다. '@echo off '를 선언하면 더 이상 자세한 출력을 억제 할 필요가 없습니다. – Squashman

+0

@ mudasobwa는 대략 어떻게 설명 할 수 있습니까? 감사! – quax

답변

1

나는 erlang의 네이티브 escript으로 대신 갈 것입니다. 빌드하려면 :

1. 업데이트 mix.exs. MyApp.main/1 함수를 만들 MyApp.Mixfile.package/0

(2)에 의해 반환되는 배열에

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

: MyApp.Mixfile.project/0 함수에 의해 반환되는 배열에

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

및 출시에 bin 디렉토리를 추가 : 추가

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

모두 설정되었습니다. 그것은 보통 오래된 좋은 실행 이후, bin/migrator에서 escript 이제

당신이 bin/migrator을 실행할 수 있어야합니다 (1 단계에서 사용 된 이름)가 릴리스 될 것입니다.

(!) 참고 :mix compile이이 실행 파일을 만들 것이다, 그래서 당신은 distillery으로 실행하기 전에 그것으로 재생하고 테스트 할 수 있습니다.

+0

~ w | 빈 LIB mix.exs README.md |, MyApp.Mixfile.package/0 – quax

+0

I에 의해 반환 된 배열에 나는 어떻게 자신을 더 잘 표현할 수 있는지 확신 할 수 없다. 'mix.exs' 파일의'project' 함수 안에있는'files'의리스트에'bin' 디렉토리를 추가하십시오. – mudasobwa

+0

알았어. 니가 의미하는 바를 알아 냈어. 니가 말한 것처럼 다 했어. 또한 나는 "escript.build를 혼합하여"escript를 생성했다. (bin/migrator)가 이제 내 프로젝트 구조에있다. Distillery (믹스 릴리스 - env ​​= prod)를 통해 빌드하면 내 릴리스 폴더에서 migrator-executable을 찾을 수 없습니다. 내가 놓친 게 있니? 빠른 답변 주셔서 감사합니다! – quax