Ответ 1
Здесь аналогичный подход для извлечения строки версии. Он также полагается на модуль :application
, но, возможно, немного более прямолинейный:
{:ok, vsn} = :application.get_key(:my_app, :vsn)
List.to_string(vsn)
У меня есть проект эликсира с определенной версией. Как я могу получить доступ к этому из запущенного приложения.
в mix.exs
def project do
[app: :my_app,
version: "0.0.1"]
end
Я хотел бы получить доступ к этому номеру версии в приложении, чтобы добавить его в возвращаемое сообщение. Я ищу что-то в env хеше, как показано ниже.
__ENV__.version
# => 0.0.1
Здесь аналогичный подход для извлечения строки версии. Он также полагается на модуль :application
, но, возможно, немного более прямолинейный:
{:ok, vsn} = :application.get_key(:my_app, :vsn)
List.to_string(vsn)
Mix.Project
сам обеспечивает доступ ко всем ключевым словам проекта, определенным в mix.exs
, используя функцию config/0
(api doc). Для краткого доступа он может быть перенесен в функцию:
@version Mix.Project.config[:version]
def version(), do: @version
В последних версиях Elixir модуль Application теперь поддерживает это:
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/application.ex
Application.spec(:my_app, :vsn)
Я нашел версию внутри :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}
Как всегда, возможно, лучший способ.
Как насчет:
YourApp.Mixfile.project[:version]
Application.spec(:my_app, :vsn)
работает при запуске приложения. Если вы находитесь в задании Mix и вам не нужно запускать приложение, в Elixir 1.8 вы можете использовать:
MyApp.MixProject.project |> Keyword.fetch!(:version)