Elixir プロジェクトでのプロトコル実装の統合に問題があります。より具体的には、私が使用Ecto
していて、いくつかの単純なプロジェクトと呼ばれGold
ます (atm はそれほど重要ではありません)。問題は、それらの両方 (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
、このようなプロトコルを 1 つだけ実装するのは少しやり過ぎのようです。モジュールが既に実装されているかどうかを確認するマクロのようなものはありませんか?