在elixir应用程序中访问项目版本
我有一个定义版本的长生不老药项目。如何从正在运行的应用程序中访问此文件 在mix.exs中在elixir应用程序中访问项目版本,elixir,otp,Elixir,Otp,我有一个定义版本的长生不老药项目。如何从正在运行的应用程序中访问此文件 在mix.exs中 def project do [app: :my_app, version: "0.0.1"] end 我想在应用程序中访问此版本号,以便将其添加到返回的消息中。我在env散列中查找如下内容 __ENV__.version # => 0.0.1 我在:application中找到了该版本。哪个应用程序,但它需要一些解析: defmodule AppHelper do
def project do
[app: :my_app,
version: "0.0.1"]
end
我想在应用程序中访问此版本号,以便将其添加到返回的消息中。我在env散列中查找如下内容
__ENV__.version
# => 0.0.1
我在
:application中找到了该版本。哪个应用程序,但它需要一些解析:
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
()功能提供对Mix.exs
中定义的所有项目关键字的访问。为了方便访问,可以将其包装到函数中:
@version Mix.Project.config[:version]
def version(),do:@version
在Elixir的最新版本中,应用程序模块现在为您包装了以下内容:
Application.spec(:my_app,:vsn)|>to_string()
对于键:vsn
和:description
返回字符表,必须使用Kernel.to_string()
方法作为Application.spec/2
<模块中的code>to_string()
将其转换为二进制。Application.spec(:my_app,:vsn)
在启动应用程序时起作用。如果您正在执行混合任务,并且不需要启动应用程序,那么在Elixir 1.8中,您可以使用:
MyApp.MixProject.project |> Keyword.fetch!(:version)
回答得好,干杯。如果这是最好的方法,那就有点遗憾了。这就是何塞·瓦利姆几周前给某人的指导。也就是说,使用:application.which\u application。这是一个更好的方法。就我个人而言,我仍然会使用charlist |>string |>integer
解析管道,但这肯定比使用哪个应用程序
更干净。是的,这一点很好。Chris的解决方案显然更长,因为它需要额外的步骤将字符串转换为整数元组。不过,仅仅为了打印,普通字符串就足够了。如果你需要的话,你可以把这两个答案结合起来得到元组。仅供参考,这是一个在审查过程中自动插入的固定评论-它实际上没有反映这种情况,这是不幸的。我自己的看法是:答案是一个陈述,最好有权威的参考资料、例子和/或经验作为支持。虽然这里没有问号,“那么……”是一个问题。如果这确实是一个答案,我建议您将其编辑为听起来像一个答案,并提供一个简短的解释,通过将提供的解决方案与问题联系起来来教育读者。确保在编译时对其进行评估,如示例所示。否则它将无法在生产中运行,因为模块混合.Project不可用
。