web-dev-qa-db-ja.com

elixirアプリケーション内でプロジェクトバージョンにアクセスする

バージョンが定義されたエリクサープロジェクトがあります。実行中のアプリケーション内からこれにアクセスするにはどうすればよいですか。

mix.exsで

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

アプリケーションでこのバージョン番号にアクセスして、返されたメッセージに追加できるようにしたいと思います。私は次のようなenvハッシュで何かを探しています

__ENV__.version
# => 0.0.1
20
Peter Saxton

バージョン文字列を取得するための同様のアプローチを次に示します。また、:applicationモジュールに依存していますが、おそらくもう少し簡単です。

{:ok, vsn} = :application.get_key(:my_app, :vsn)
List.to_string(vsn)
16
Patrick Oscity

Mix.Project自体は、mix.exsapi doc )関数を使用して、config/0で定義されたすべてのプロジェクトキーワードへのアクセスを提供します。簡潔なアクセスのために、それは関数にラップされるかもしれません:

@version Mix.Project.config[:version]
def version(), do: @version
28
0x0me

Elixirの最近のバージョンでは、アプリケーションモジュールがこれをラップします。

https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/application.ex

Application.spec(:my_app, :vsn)

9
Dr. Ernie

: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}

いつものように、おそらくもっと良い方法があります。

6
Chris Meyer

どうですか:

YourApp.Mixfile.project[:version]
3
Kernael

Application.spec(:my_app, :vsn)は、アプリケーションの起動時に機能します。ミックスタスクを実行していて、アプリケーションを起動する必要がない場合は、Elixir1.8で次を使用できます。

MyApp.MixProject.project |> Keyword.fetch!(:version)
0
Alex