依赖项目中的协议实现重复



我在Elixir项目中整合协议实现时遇到了问题。更具体地说,我使用Ecto和一些称为Gold的简单项目(atm无关紧要)。问题是,它们(EctoGold)都使用Poison来序列化Decimals(并实现正确的协议)。

Ecto的实现看起来有点像这样:

defimpl Poison.Encoder, for: Decimal do
    def encode(decimal, _opts), do: <<?", Decimal.to_string(decimal)::binary, ?">>
end

在开发过程中,有一个警告,指出模块是重复的:

warning: redefining module Poison.Encoder.Decimal (current version loaded from /(...)/_build/dev/lib/gold/ebin/Elixir.Poison.Encoder.Decimal.beam)
  lib/ecto/poison.ex:2

但是当我尝试使用例如exrm来构建版本时,我收到错误说我有duplicate_modules

===> Provider (release) failed with: {error,
                     {rlx_prv_assembler,
                      {release_script_generation_error,
                       systools_make,
                       {duplicate_modules,
                        [{{'Elixir.Poison.Encoder.Decimal',
                           gold,
                           "/(...)/rel/bitcoin_api/lib/gold-0.12.0/ebin"},
                          {'Elixir.Poison.Encoder.Decimal',
                           ecto,
                           "/(...)/rel/bitcoin_api/lib/ecto-2.0.2/ebin"}}]}}}}

我应该如何处理?这里的情况是我实际上使用我自己的Gold版本,所以我可以篡改它以尽快修复它。我知道我可以将Ecto作为依赖项添加到Gold中,但是仅实现这样的协议似乎有点矫枉过正。难道没有某种宏来检查模块是否已实现吗?

一个快速的解决方案可能是将Gold的实现包装在一个Code.ensure_loaded?/1

unless Code.ensure_loaded?(Ecto) do
  defimpl Poison.Encoder, for: Decimal do
    def encode(decimal, _opts), do: <<?", Decimal.to_string(decimal)::binary, ?">>
  end
end

它有点令人讨厌,但你不必添加 Ecto,但只需检查是否有其他东西已经拉了它

相关内容

  • 没有找到相关文章

最新更新