12

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ため、それを改ざんしてできるだけ早く修正することができます。依存関係として追加できることはわかっていますEctoGold、このようなプロトコルを 1 つだけ実装するのは少しやり過ぎのようです。モジュールが既に実装されているかどうかを確認するマクロのようなものはありませんか?

4

1 に答える 1