我有一個定義版本的elixir項目。我如何從正在運行的應用程序中訪問它。在elixir應用程序中訪問項目版本
在mix.exsdef project do
[app: :my_app,
version: "0.0.1"]
end
我想是訪問應用程序中的這個版本號,所以我可以將它添加到返回的消息。我尋找的東西在ENV哈希像下面
__ENV__.version
# => 0.0.1
我有一個定義版本的elixir項目。我如何從正在運行的應用程序中訪問它。在elixir應用程序中訪問項目版本
在mix.exsdef 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)
我發現: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}
一如既往,可能有更好的方法。
好答案的歡呼聲。雖然這是最好的解決方法,但有點遺憾。 –
這就是Jose Valim幾個星期前給某人的指導。也就是說,使用:application.which_application。 https://groups.google.com/d/msg/elixir-lang-talk/qlX4hJKZvC8/pCZBqM1zCQAJ –
什麼:
YourApp.Mixfile.project[:version]
只是供參考,這是一個在評論期間自動插入的罐裝評論 - 它確實不反映這種情況,這是不幸的。我自己的看法:答案是一個_statement_,理想地用權威的參考資料,例子和/或經驗來支持。雖然這裏沒有問號,但「怎麼樣......」是個問題。如果這確實是一個答案,我建議你編輯它聽起來像一個,並提供一個簡短的解釋,將教育讀者連接提供的解決方案的問題。 – Mogsdad
在最近版本的靈藥,應用模塊現在包裹這個給你:
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/application.ex
Application.spec(:my_app, :vsn)
這是一個更好的方法。就個人而言,我仍然使用'charlist |> string |>整數'解析管道,但這絕對比使用'which_applications'更清晰。 –
是的好點。克里斯的解決方案顯然更長,因爲它會將字符串轉換爲整數元組。只是爲了打印,普通的字符串應該足夠了。如果你需要的話,你可以結合這兩個答案來獲得元組。 –