当2个库共享相同的依赖项并需要不同的版本时,混合deps错误

时间:2019-03-09 19:59:18

标签: elixir phoenix-framework

我在解决phoenix应用程序的依赖项时遇到问题:

我的mix.exs文件具有:

{:phoenix, "~> 1.4.0"},
{:phoenix_pubsub, "~> 1.1"},
{:phoenix_ecto, "~> 4.0"},
{:ecto_sql, "~> 3.0"},
{:postgrex, ">= 0.0.0"},
{:phoenix_html, "~> 2.11"},
{:phoenix_live_reload, "~> 1.2", only: :dev},
{:gettext, "~> 0.11"},
{:jason, "~> 1.0"},
{:plug_cowboy, "~> 2.0"},
{:redix, ">= 0.0.0"},
{:extwitter, "~> 0.9.3"},      
{:timex, "~> 3.0"},
{:corsica, "~> 1.0"},
{:cachex, "~> 3.1"},
{:bamboo, "~> 1.1"},
{:bamboo_ses, "~> 0.1.0"},
{:comeonin, "~> 4.1"},
{:bcrypt_elixir, "~> 1.1"},
{:ex_machina, "~> 2.2", only: :test}

I then added this stripe library:

 {:stripity_stripe, "~> 2.0.0"},

现在,当我执行deps.get时,我看到此错误:

  

由于使用Bamboo,因此无法使用“ hackney”(版本1.13.0至1.15.1)   (版本1.1.0和1.2.0)要求> = 1.13.0 stripity_stripe   (版本2.0.0和2.0.1)需要〜> 1.12.1

     

**(混合)十六进制依赖关系解析失败,更改了依赖关系的版本要求或将它们解锁(通过使用mix   deps.update或混合使用deps.unlock)。如果您无法解决   您可以尝试使用{:dependency,“〜> 1.0”覆盖冲突,   覆盖:true}

我已经做到了:

mix clean
rm mix.lock
mix deps.get

如何使用该替代选项?如果两个库需要不同版本的共享依赖项,这将如何工作?

2 个答案:

答案 0 :(得分:1)

我找到了similar question on the elixir forum。相关报价:

  

同一应用程序不能同时运行多个版本

  

单个模块只能在VM上的一个版本中存在。因此,这限制了应用程序的结构。这基本上意味着每个人都需要在一个版本上达成共识。

此外,the docs for :override状态:

  

如果设置为true,则依赖关系将被其他依赖关系覆盖其自身的任何其他定义

这听起来不像您想要的,因为您将强制stripity_stripe 2.0.0使用与期望版本不同的版本。

您似乎需要找到stripity_stripe依赖的hackney版本的:bamboo, "~> 1.1"版本。

所以

{:bamboo, "~> 1.1"},
{:stripity_stripe, "~> 2.2.2"}

看起来不错。我用mix deps.get进行了测试,很好。

答案 1 :(得分:0)

在可能的情况下,您可以使用

{:stripity_stripe, "~> 2.2.2"}

或者您应该能够将hackney添加为依赖项并应用override: true

{:hackney, "~> 1.13", override: true}

希望有帮助