我在我的 Elixir 项目中遇到了协议实现的整合问题。更具体地说,我使用了 Ecto
和一些简单的项目叫做 Gold
(目前不太重要)。问题是,它们两个(Ecto
和 Gold
)都使用 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
的 Decimal 实现被定义之前)。 - Qqwydecimal
本身,也可以是另一个名为decimal_poison
的包)。如果您在Ecto上开一个问题以突出这个问题,那就太好了。 - Derek Kraan