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

Bla*_*man 4 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"},
Run Code Online (Sandbox Code Playgroud)

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

无法使用“hackney”(版本1.13.0至1.15.1),因为bamboo(版本1.1.0和1.2.0)需要> = 1.13.0 stripity_stripe(版本2.0.0和2.0.1)需要〜> 1.12。 1

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

我已经这样做了:

mix clean
rm mix.lock
mix deps.get
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*hip 6

在 Elixir 论坛上发现了类似的问题。相关报价:

\n\n
\n

您可以\xe2\x80\x99t同时运行同一应用程序的多个版本

\n
\n\n

\n\n
\n

单个模块只能存在于 VM 上的一个版本中。所以这对应用程序结构造成了限制。这基本上意味着每个人都需要就单一版本达成一致。

\n
\n\n

另外,状态文档:override

\n\n
\n

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

\n
\n\n

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

\n\n

看起来您需要找到一个stripity_stripe依赖于hackney也支持的版本的版本:bamboo, "~> 1.1"

\n\n\n\n

所以,

\n\n
{:bamboo, "~> 1.1"},\n{:stripity_stripe, "~> 2.2.2"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

看起来不错。我对此进行了测试mix deps.get,效果很好。

\n