インターフェースを満たす構造を実装した go モジュールを書いています。私たちはライブラリの単一バージョンのみを維持したいのですが、顧客は依存関係の 1 つについて複数のバージョンを使用しています。
依存関係は、以下に示すように、実装したいインターフェイスを提供します。
リーリー私たちの実装は次のようになります。
リーリー依存関係の新しいバージョンでは、types モジュールに新しいタイプが追加されます。
リーリー依存関係により、インターフェイスにメソッドが追加されます。
リーリーここで、新しいメソッドを実装すると、types.newtype
が存在しないため、古いバージョンのライブラリではコンパイルできません。ただし、新しいバージョンのインターフェイスを実装しないと、新しいバージョンを満足できません。
このバージョンをサポートするにはコードをフォークする必要がありますか?プリプロセッサを備えた言語には簡単な解決策があるので、go には私が欠けている解決策があるはずだと思います。
私たちは両方のバージョンの開発とサポートを継続する予定なので、2 つの異なるバージョン間の一貫性を確保する必要があるのは面倒です。リフレクションまたは C プリプロセッサに似た何かを使用して、プリプロセッサ値を定義し、ライブラリのバージョンに正しい型を持つように指示した場合にのみメソッドを実装できることを期待しています。
私の状況に適した解決策を見つけました。
私を正しい方向に導いてくれた @Burak Serdar に感謝します。
私の解決策は、古い実装を impl/v0 パッケージに入れ、新しい実装を impl/v1 パッケージに入れることでした。
古いバージョンの依存関係を使用するクライアントは impl/v0 を使用し、新しいバージョンの依存関係を使用するクライアントは impl/v1 を使用します。
golang は直接インポートされたコードのみをコンパイルするため、正しいインターフェイス バージョンを持つパッケージのみがコンパイルされ、双方向で正常にコンパイルされます。
これにより、ライブラリ全体をフォークする必要があるという懸念が軽減されます。
編集: 誰かがこのソリューションを使用している場合、現在 go test ./...
を使用してテストを実行している場合には問題が発生します。このコマンドは、テストが含まれているかどうかに関係なく、すべてのモジュールをビルドしようとしているようです。
ただし、go test $(go list ./... | grep -v <path_to_ignore>)</path_to_ignore>
を使用してテストを除外し、別のコマンド テストで正しいバージョンに対してこれらのテストを実行できます。 。
以上が同じインターフェースの複数のバージョンをサポートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。