在 elixir 应用程序中访问项目版本
Access project version within elixir application
我有一个已定义版本的长生不老药项目。我如何从 运行 应用程序中访问它。
在mix.exs
def project do
[app: :my_app,
version: "0.0.1"]
end
我想在应用程序中访问此版本号,以便将其添加到返回的消息中。我在 env 哈希中寻找如下内容
__ENV__.version
# => 0.0.1
我在 :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}
一如既往,可能有更好的方法。
这是检索版本字符串的类似方法。它还依赖于 :application
模块,但可能更直接一些:
{:ok, vsn} = :application.get_key(:my_app, :vsn)
List.to_string(vsn)
怎么样:
YourApp.Mixfile.project[:version]
Mix.Project
本身使用其 config/0
(api doc) 函数提供对 mix.exs
中定义的所有项目关键字的访问。为了简洁访问,它可能被包装到一个函数中:
@version Mix.Project.config[:version]
def version(), do: @version
在最新版本的 Elixir 中,应用程序模块现在为您包装了这个:
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/application.ex
Application.spec(:my_app, :vsn) |> to_string()
Kernel.to_string()
方法是必需的,因为 Application.spec/2
键 :vsn
和 :description
return 字符列表。来自 Kernel 模块的 to_string()
将它们转换为二进制文件。
Application.spec(:my_app, :vsn)
在应用程序启动时起作用。如果你在 Mix 任务中并且不需要启动应用程序,在 Elixir 1.8 中你可以使用:
MyApp.MixProject.project |> Keyword.fetch!(:version)
我有一个已定义版本的长生不老药项目。我如何从 运行 应用程序中访问它。
在mix.exs
def project do
[app: :my_app,
version: "0.0.1"]
end
我想在应用程序中访问此版本号,以便将其添加到返回的消息中。我在 env 哈希中寻找如下内容
__ENV__.version
# => 0.0.1
我在 :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}
一如既往,可能有更好的方法。
这是检索版本字符串的类似方法。它还依赖于 :application
模块,但可能更直接一些:
{:ok, vsn} = :application.get_key(:my_app, :vsn)
List.to_string(vsn)
怎么样:
YourApp.Mixfile.project[:version]
Mix.Project
本身使用其 config/0
(api doc) 函数提供对 mix.exs
中定义的所有项目关键字的访问。为了简洁访问,它可能被包装到一个函数中:
@version Mix.Project.config[:version]
def version(), do: @version
在最新版本的 Elixir 中,应用程序模块现在为您包装了这个:
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/application.ex
Application.spec(:my_app, :vsn) |> to_string()
Kernel.to_string()
方法是必需的,因为 Application.spec/2
键 :vsn
和 :description
return 字符列表。来自 Kernel 模块的 to_string()
将它们转换为二进制文件。
Application.spec(:my_app, :vsn)
在应用程序启动时起作用。如果你在 Mix 任务中并且不需要启动应用程序,在 Elixir 1.8 中你可以使用:
MyApp.MixProject.project |> Keyword.fetch!(:version)