Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在elixir应用程序中访问项目版本_Elixir_Otp - Fatal编程技术网

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

在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

我有一个定义版本的长生不老药项目。如何从正在运行的应用程序中访问此文件

在mix.exs中

  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不可用