我有一个OTP应用程序。此应用程序的版本位于两个位置:src/application_name.src
文件(OTP应用程序的标准)和我的rebar.config。
应用程序是否有“官方”方式来获取自己的版本,还是需要通过sed / grep等进行攻击?我想在我的应用程序中有一个“info”端点,它打印出自己的版本。当然我总是可以做一些像我的rebar.config中的grep版本,但它看起来很hacky。
答案 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"}