在elixir应用程序中访问项目版本

时间:2015-10-06 10:57:53

标签: elixir otp

我有一个定义版本的elixir项目。如何从正在运行的应用程序中访问它。

在mix.exs

  def project do
    [app: :my_app,
     version: "0.0.1"]
  end

我想在应用程序中访问此版本号,以便将其添加到返回的消息中。我在env哈希中寻找一些东西,如下面的

__ENV__.version
# => 0.0.1

6 个答案:

答案 0 :(得分:27)

Mix.Project本身可以使用mix.exsapi 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)