2017-03-31 11 views
2

私はOTPアプリケーションを持っています。このアプリケーションのバージョンは、src/application_name.srcファイル(OTPアプリケーションの標準)とmy rebar.configの2つの場所にあります。Erlang:プログラムでアプリケーションバージョンを取得する

アプリケーションが独自のバージョンを取得するための「正式な」方法はありますか、それともsed/grepなどでハッキングする必要がありますか?自分のバージョンを印刷するアプリケーションに「情報」エンドポイントが必要です。もちろん、私はrebar.configのバージョンからgrepのようなものをいつでも実行できますが、これはハッキリのようです。

答えて

3

Erlang documentationによると、のアプリケーションモジュールを使用することができます。

例:

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). 

欠点は、あなたが(原子など)、アプリケーションの名前をハードコーディングする必要がないということです。私はこれを回避する方法を見つけたことはありませんでしたが、あなたは何か料理をすることができるかもしれません。

関連する問題