Erlang:以编程方式获取应用程序版本

时间:2017-03-31 18:38:36

标签: erlang

我有一个OTP应用程序。此应用程序的版本位于两个位置:src/application_name.src文件(OTP应用程序的标准)和我的rebar.config。

应用程序是否有“官方”方式来获取自己的版本,还是需要通过sed / grep等进行攻击?我想在我的应用程序中有一个“info”端点,它打印出自己的版本。当然我总是可以做一些像我的rebar.config中的grep版本,但它看起来很hacky。

3 个答案:

答案 0 :(得分:4)

根据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>

答案 1 :(得分: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).

缺点是您必须对应用程序的名称进行硬编码(作为原子)。我从来没有找到解决方法,但你可以做点什么。

答案 2 :(得分:1)

application:get_key / 1,2可为您提供应用程序的版本号。

1> application:get_key(tfs, vsn).
{ok,"94a3d72"}
2> application:get_key(mnesia, vsn).
{ok,"4.16.1"}