2015-10-06 24 views
11

我有一個定義版本的elixir項目。我如何從正在運行的應用程序中訪問它。在elixir應用程序中訪問項目版本

在mix.exs

def project do 
    [app: :my_app, 
    version: "0.0.1"] 
    end 

我想是訪問應用程序中的這個版本號,所以我可以將它添加到返回的消息。我尋找的東西在ENV哈希像下面

__ENV__.version 
# => 0.0.1 

回答

10

下面是一個類似的方法來檢索版本字符串。這也依賴於:application模塊上,但也許有點更直截了當:

{:ok, vsn} = :application.get_key(:my_app, :vsn) 
List.to_string(vsn) 
+0

這是一個更好的方法。就個人而言,我仍然使用'charlist |> string |>整數'解析管道,但這絕對比使用'which_applications'更清晰。 –

+0

是的好點。克里斯的解決方案顯然更長,因爲它會將字符串轉換爲整數元組。只是爲了打印,普通的字符串應該足夠了。如果你需要的話,你可以結合這兩個答案來獲得元組。 –

6

我發現: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} 

一如既往,可能有更好的方法。

+0

好答案的歡呼聲。雖然這是最好的解決方法,但有點遺憾。 –

+1

這就是Jose Valim幾個星期前給某人的指導。也就是說,使用:application.which_application。 https://groups.google.com/d/msg/elixir-lang-talk/qlX4hJKZvC8/pCZBqM1zCQAJ –

3

什麼:

YourApp.Mixfile.project[:version] 
+0

只是供參考,這是一個在評論期間自動插入的罐裝評論 - 它確實不反映這種情況,這是不幸的。我自己的看法:答案是一個_statement_,理想地用權威的參考資料,例子和/或經驗來支持。雖然這裏沒有問號,但「怎麼樣......」是個問題。如果這確實是一個答案,我建議你編輯它聽起來像一個,並提供一個簡短的解釋,將教育讀者連接提供的解決方案的問題。 – Mogsdad

20

Mix.Project本身提供了使用mix.exs中定義的所有項目的關鍵字訪問其config/0api doc)功能。爲了簡要的訪問可能被包裝成一個函數:

@version Mix.Project.config[:version] 
def version(), do: @version 
+2

確保在編譯時評估這一點,如示例中所示。否則,它不會在生產中工作,因爲'模塊Mix.Project不可用'。 – Johannes

相關問題