2017-03-31 1 views
2

OTP 응용 프로그램이 있습니다. 이 응용 프로그램의 버전은 src/application_name.src 파일 (표준 OTP 응용 프로그램)과 my rebar.config에 있습니다.Erlang : 프로그래밍 방식으로 응용 프로그램 버전 얻기

응용 프로그램이 자체 버전을 얻는 "공식적인"방법이 있습니까, 아니면 sed/grep 등을 통해 해킹해야합니까? 내 응용 프로그램에 자체 버전을 인쇄하는 "정보"끝점을 갖고 싶습니다. 물론 나는 항상 rebar.config 파일에서 grep과 같은 것을 할 수 있지만 해커처럼 보인다.

답변

3

Erlang documentation에 따르면 모듈의 API를 사용할 수 있습니다.

예 :

Erlang/OTP 19 [erts-8.2.2] [source-1ca84a4] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] 

Eshell V8.2.2 (abort with ^G) 
1> application:loaded_applications(). 
[{stdlib,"ERTS CXC 138 10","3.2"}, 
{kernel,"ERTS CXC 138 10","5.1.1"}] 

2> GetVer = 
fun(App) -> 
    case lists:keyfind(App, 1, application:loaded_applications()) of 
     {_, _, Ver} -> 
      Ver; 
     false -> 
      not_found 
    end 
end. 
#Fun<erl_eval.6.52032458> 

3> GetVer(stdlib). 
"3.2" 

4> GetVer(eunit). 
not_found 

5> application:load(eunit). 
ok 

6> GetVer(eunit).   
"2.3.2" 

7> 
+0

이 큰 감사를했다! – Tommy

3

응용 프로그램으로 올바르게 패키지 된 경우 application:which_applications()을 사용하여 가져올 수 있습니다. 좀 sample code을 가지고 있지만, 기본적으로는 다음과 같이 할 것 :

vsn() -> vsn(your_application_atom_name). 

vsn(Application) -> vsn(Application, application:which_applications()). 
vsn(_Application, []) -> undefined; 
vsn(Application, [{Application,_,Vsn}|_]) -> Vsn; 
vsn(Application, [_|Rest]) -> vsn(Application, Rest). 

단점은 당신이 (원자로) 응용 프로그램의 이름을 하드 코딩 할 필요가 없다는 것입니다을. 나는 이것에 대한 방법을 찾지 못했지만 뭔가를 요리 할 수 ​​있을지도 모릅니다.

관련 문제