Доступ к версии проекта в приложении elixir

У меня есть проект эликсира с определенной версией. Как я могу получить доступ к этому из запущенного приложения.

в mix.exs

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

Я хотел бы получить доступ к этому номеру версии в приложении, чтобы добавить его в возвращаемое сообщение. Я ищу что-то в env хеше, как показано ниже.

__ENV__.version
# => 0.0.1

Ответ 1

Здесь аналогичный подход для извлечения строки версии. Он также полагается на модуль :application, но, возможно, немного более прямолинейный:

{:ok, vsn} = :application.get_key(:my_app, :vsn)
List.to_string(vsn)

Ответ 2

Mix.Project сам обеспечивает доступ ко всем ключевым словам проекта, определенным в mix.exs, используя функцию config/0 (api doc). Для краткого доступа он может быть перенесен в функцию:

@version Mix.Project.config[:version]
def version(), do: @version

Ответ 4

Я нашел версию внутри :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}

Как всегда, возможно, лучший способ.

Ответ 5

Как насчет:

YourApp.Mixfile.project[:version]

Ответ 6

Application.spec(:my_app, :vsn) работает при запуске приложения. Если вы находитесь в задании Mix и вам не нужно запускать приложение, в Elixir 1.8 вы можете использовать:

MyApp.MixProject.project |> Keyword.fetch!(:version)