本文へ移動

Goモジュール

etcdプロジェクトのGoモジュール構成

etcdプロジェクトはバージョン3.5以降、単一のリポジトリ に置かれた複数のGoモジュール で構成されています。

モジュールの依存関係図

次のモジュールがあります。

  • go.etcd.io/etcd/api/v3 - etcdクライアントとサーバー間の通信プロトコルを定義する API定義(protoやprotoから生成されたライブラリーなど)を含みます。

  • go.etcd.io/etcd/pkg/v3 - etcdで使用する、etcd固有ではないユーティリティーパッケージ群です。 将来独立したリポジトリに移せる可能性のあるパッケージだけをここに置きます。 多くの依存関係を持つコードの追加は避けてください。 それらは自動的にクライアントライブラリーの依存関係にもなり、 軽量に保つという方針に反するためです。

  • go.etcd.io/etcd/client/v3 - ネットワーク(grpc)経由でetcdに接続するクライアントライブラリーです。 etcdの新規利用すべてに推奨します。

  • go.etcd.io/etcd/client/v2 - HTTPプロトコル経由でetcdに接続する旧クライアントライブラリーです。 非推奨です。新規利用ではすべて/v3ライブラリーへの依存を推奨します。

  • go.etcd.io/etcd/raft/v3 - 分散コンセンサスプロトコルの実装です。 etcd固有のコードを含めないようにしてください。

  • go.etcd.io/etcd/server/v3 - etcdの実装です。 このパッケージのコードはetcdの内部実装であり、外部プロジェクトからの利用は推奨しません。 パッケージ構成やAPIは同じマイナーバージョン内でも変更される場合があります。

  • go.etcd.io/etcd/etcdctl/v3 - etcdへのアクセスと管理を行うコマンドラインツールです。

  • go.etcd.io/etcd/tests/v3 - etcdのすべての結合テストを含むモジュールです。 注意:単体テスト(高速でモジュール間の依存関係を必要としないもの)はすべて、 テスト対象のコードと同じモジュールに置くことを推奨します。

  • go.etcd.io/bbolt - 永続的なB木の実装です。 独立したリポジトリ https://github.com/etcd-io/bbolt に置かれています。

運用

  1. etcdのすべてのモジュールは、同じバージョンでリリースすることを推奨します。たとえば、 go.etcd.io/etcd/client/v3@v3.5.10はgo.etcd.io/etcd/api/v3@v3.5.10に依存しなければなりません。

    バージョンを一貫して更新するには、次のコマンドを使用できます。

    % DRY_RUN=false TARGET_VERSION="v3.5.10" ./scripts/release_mod.sh update_versions
  2. リリースするモジュールは https://golang.org/ref/mod#vcs-version の規則に従ってタグ付けすることを推奨します。 つまり、モジュールごとに固有のタグを付けます。 タグ付けには次のコマンドを使用できます。

    % DRY_RUN=false REMOTE_REPO="origin" ./scripts/release_mod.sh push_mod_tags
  3. etcdのすべてのモジュールは、共通の依存先に対して同じバージョンに依存することを推奨します。 次のコマンドで確認できます。

    % PASSES="dep" ./test.sh
  4. go.modファイルには未使用の依存関係を含めてはならず、 go mod tidyの形式に従わなければなりません。 次のコマンドで確認します。

    % PASSES="mod_tidy" ./test.sh
  5. 全ファイルの自動整形など、すべてのモジュールに対する操作を行うには、 次のスクリプトを使用または拡張してください。

    % ./scripts/fix.sh

今後の方向性

長期的な目標として、etcdのモジュール構成を次のモデルに近づけたいと考えています。

将来のモジュール依存関係図

このモデルは次を前提とします。

  • etcdmigrate/etcdadmをetcdctlバイナリーから分離します。 これにより、etcdctlはネットワーククライアントAPIを扱う コマンドラインのラッパーとして明確に位置付けられ、 etcdmigrate/etcdadmはetcdのストレージファイルに対する 直接的な物理操作を担うようになります。
  • etcd-proxyを./etcdバイナリーから分離します。実験的なコードが多く、 追加のリスクと依存関係を伴うためです。
  • v2プロトコルのサポートを非推奨にします。