我有一个定义版本的elixir项目。如何从正在运行的应用程序中访问它。
在mix.exs
中 def project do
[app: :my_app,
version: "0.0.1"]
end
我想在应用程序中访问此版本号,以便将其添加到返回的消息中。我在env哈希中寻找一些东西,如下面的
__ENV__.version
# => 0.0.1
答案 0 :(得分:27)
Mix.Project
本身可以使用mix.exs
(api doc)函数访问config/0
中定义的所有项目关键字。为了简洁访问,它可能被包装到一个函数中:
@version Mix.Project.config[:version]
def version(), do: @version
答案 1 :(得分:14)
这是检索版本字符串的类似方法。它也依赖于:application
模块,但可能更简单一点:
{:ok, vsn} = :application.get_key(:my_app, :vsn)
List.to_string(vsn)
答案 2 :(得分:8)
在Elixir的最新版本中,Application模块现在为您包装:
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/application.ex
Application.spec(:my_app, :vsn)
答案 3 :(得分:6)
我在:application.which_applications
内找到了版本,但它需要一些解析:
defmodule AppHelper do
@spec app_version(atom) :: {integer, integer, integer}
def app_version(target_app) do
:application.which_applications
|> Enum.filter(fn({app, _, _}) ->
app == target_app
end)
|> get_app_vsn
end
# I use a sensible fallback when we can't find the app,
# you could omit the first signature and just crash when the app DNE.
defp get_app_vsn([]), do: {0,0,0}
defp get_app_vsn([{_app, _desc, vsn}]) do
[maj, min, rev] = vsn
|> List.to_string
|> String.split(".")
|> Enum.map(&String.to_integer/1)
{maj, min, rev}
end
end
然后用于:
iex(1)> AppHelper.app_version(:logger)
{1, 0, 5}
与往常一样,可能有更好的方法。
答案 4 :(得分:3)
怎么样:
YourApp.Mixfile.project[:version]
答案 5 :(得分:0)
Application.spec(:my_app, :vsn)
在启动应用程序时有效。如果您正在执行Mix任务,而无需启动应用程序,则可以在Elixir 1.8中使用:
MyApp.MixProject.project |> Keyword.fetch!(:version)