バージョンが定義されたエリクサープロジェクトがあります。実行中のアプリケーション内からこれにアクセスするにはどうすればよいですか。
mix.exsで
def 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)
Mix.Project
自体は、mix.exs
( api doc )関数を使用して、config/0
で定義されたすべてのプロジェクトキーワードへのアクセスを提供します。簡潔なアクセスのために、それは関数にラップされるかもしれません:
@version Mix.Project.config[:version]
def version(), do: @version
Elixirの最近のバージョンでは、アプリケーションモジュールがこれをラップします。
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/application.ex
Application.spec(:my_app, :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}
いつものように、おそらくもっと良い方法があります。
どうですか:
YourApp.Mixfile.project[:version]
Application.spec(:my_app, :vsn)
は、アプリケーションの起動時に機能します。ミックスタスクを実行していて、アプリケーションを起動する必要がない場合は、Elixir1.8で次を使用できます。
MyApp.MixProject.project |> Keyword.fetch!(:version)