+incompatibleモジュールバージョンの処理

Goモジュールバージョンの+incompatibleサフィックスを理解します。このサフィックスを持つモジュールが存在する理由と、セマンティックインポートバージョニングに従わなかったモジュール前のGoパッケージの扱い方を学びます。

Workspace

詳細な説明

+incompatibleサフィックス

go.modの一部のモジュールバージョンには+incompatibleサフィックスがあります:

require (
    github.com/docker/docker v24.0.7+incompatible
)

意味

+incompatibleサフィックスは、モジュールが:

  1. gitタグでメジャーバージョンv2以上を持つ
  2. go.modファイルがない(またはgo.modが/vNサフィックスを使用していない)
  3. Goモジュールが標準化される前に作成された

なぜ存在するのか

Goモジュール以前(Go 1.11以前)、Goパッケージはインポート互換性ルールに従っていませんでした。Goモジュールが導入された時、これらの既存タグが何らかの形で機能する必要がありました。

+incompatibleモジュールの扱い

  • サフィックスを削除できない — モジュール作者のリポジトリによって決定される
  • go getが自動的に追加する
  • フォーマッターはサフィックスをそのまま保持する
  • 機能的には他の依存関係と同じように動作する

ユースケース

+incompatibleバージョンに遭遇するのは、Docker SDK、特定のデータベースドライバー、その他のモジュール前のGoパッケージを扱う際に一般的です。このサフィックスを理解することで、go.modファイルを読む際の混乱を避けられます。

試してみる — go.mod Formatter

フルツールを開く