Elixir - 如何动态获取项目中使用的库版本?

Bar*_*cki 2 dependencies version elixir-mix elixir

我在获取在我从事的项目之一中使用的依赖项版本时遇到问题。我想在我的代码中获取此依赖项的版本。有什么简单的方法可以做到这一点吗?

我尝试了以下方法:

{:ok, dependency_version} = Mix.Dep.cached 
                           |> Enum.filter(fn(d) -> d.app == :dependency_name end) 
                           |> hd 
                           |> Map.fetch!(:status)
Run Code Online (Sandbox Code Playgroud)

但正如我在文档中读到的那样,如果设置了,Mix.dep.cached可能会返回一个空数组。MIX_NO_DEPS除了创建一个返回自身版本的依赖函数之外,还有其他可靠的方法可以做到这一点吗?

Dog*_*ert 7

您可以使用 获取依赖项的版本Application.spec/2,将依赖项的名称作为第一个参数和:vsn第二个参数传递。

来自 Ecto master 的示例应用程序:

$ iex -S mix
iex(1)> Application.spec(:ecto, :vsn)
'3.0.0-dev'
iex(2)> Application.spec(:postgrex, :vsn)
'0.14.0-dev'
Run Code Online (Sandbox Code Playgroud)