Goの外部パッケージに独自の変更を加える

外部パッケージを使っていて、ちょっとした修正を試したい時は以下のような方法があります。

1. 外部パッケージをForkしてgo.modで置き換える

最も基本的なやり方なので特に理由がなければこちらの方法にするのが良いでしょう。
対象のパッケージのForkに変更を加え、以下のようにしてgo.modで置き換えます。

go mod edit -replace github.com/EXTERNAL_/PACKAGE@v1.0.0=github.com/daisuzu/PACKAGE@development
go mod tidy

なお、Forkにコミットを追加する場合はその度にgo mod tidyで擬似バージョンを更新していく必要があります。

2. 外部パッケージのコピーをリポジトリに追加してgo.modで置き換える

Forkを作りたくなかったり、試行錯誤したい場合などはリポジトリの中に対象の外部パッケージをコピーする方がやりやすいかもしれません。
その場合も同様にgo.modで置き換えます。

go mod edit -replace github.com/EXTERNAL_/PACKAGE@v1.0.0=./PATH_TO_COPY

3. 変更したファイルをリポジトリに追加してoverlayで書き換える

変更が数行程度だと上記の方法が面倒だと感じることがあるかもしれません。
その場合は変更したファイルのみをリポジトリに追加し、goコマンドのoverlayフラグで書き換えることも可能です。

以下のようなoverlay.jsonを用意してgo build -overlay=overlay.jsonのように指定します。

{
  "Replace": {
    "/GO_MOD_CACHE/PATH_TO_EXTERNAL_PACKAGE/TARGET.go": "/PATH_TO_COPY/TARGET.go"
  }
}

いずれの方法もうまくいったら本家に還元しましょう。