以编程方式确定 Elixir Mix Task 中的依赖版本

Programmatically determine a dependency version in Elixir Mix Task

有没有办法以编程方式在自定义 Mix 任务中安装依赖项的当前版本?

我有一个包,其中包含一些自定义 Mix 任务,运行 一些生成器命令。我想确定 Phoenix 的版本我的 hex 包的用户是 运行ning 以便我可以有条件地在我的生成器任务中执行一些逻辑。

我的hex包依赖于Phoenix,但也支持Phoenix 1.3、1.4和新发布的1.5。

我意识到我可以发布一个新版本的 hex 包,它具有 phoenix 1.5 的固定依赖性要求,同时仍然向后移植对我的包的旧主要版本的更改;但我更愿意保留一个单一的主线分支,暂时支持尽可能多的版本。

是否有 "decent" 方法可以做到这一点,或者我应该在混合任务中自己解析 mix.lock 文件?这样做似乎很脆弱,我认为我的包代码不应该四处搜索并解析它包含在其中的更大项目的锁文件。

我还没有针对您的具体要求进行测试,但您可以这样做:

app_version =
  Application.spec(:phoenix)[:vsn]
  |> List.to_string()
# OR
:application.get_key(:phoenix, :vsn)
|> List.to_string()

以下代码片段也可能有用:如果您有一个模块但不知道它所属的 Atom 应用程序名称:

app_name = Application.get_application(SomeApp)

有关详细信息,请参阅 Application docs

希望对您有所帮助。