はじめに
go言語のworkspace機能を利用中、go mod tidy
コマンドを実行したところ、エラーが発生しました。
workspace内で使用しているパッケージが、ローカルにしか存在しなかったため、パッケージをリモートから取得できずエラーになっていたようです。
workspace内限定の依存関係というのは珍しくなく、むしろworkspace機能を使用している目的の場合もあると思います。
そういうったプライベートな依存と通常のパブリックの依存が入り混じった状況で、依存関係を自動で整理してくれるgo mod tidy
が使えないのは不便です。
回避策がありますので、紹介します。
この記事で伝えたいこと
go mod tidy
コマンド実行時、エラーを無視する-e
オプションを追加します。
$ go mod tidy -e
The -e flag causes tidy to attempt to proceed despite errors
encountered while loading packages.
issueも立っているため、将来的にgo言語側で対応される可能性はありますが、今のところはこれが回避策です。
https://github.com/golang/go/issues/50750#issuecomment-1018863325
前提条件
go version
この記事は、1.23.1時点でのものです。
go version
go version go1.23.1 darwin/arm64
検証環境
workspaceが手元にない方のために、今回検証に使用した環境をGitHubで公開しています。
https://github.com/ymuraki-csc/go-test-work
workspaceの詳しい解説や手順は、公式ドキュメントをご覧ください。
https://go.dev/doc/tutorial/workspaces
go mod tidy
をworkspace内で実行してみる
tidy
で削除されることを期待するパッケージとして、MySQLのドライバーをtestsモジュールに追加します。
cd tests/
go get github.com/go-sql-driver/mysql
tests/go.mod
は、次のようになっていると思います。
module example.com/tests
go 1.23.1
require github.com/google/go-cmp v0.6.0
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
)
go mod tidy
(失敗)
まずは何もオプションを付けずに実行しています。
$ go mod tidy
go: finding module for package example.com/demo-pkg
go: example.com/tests tested by
example.com/tests.test imports
example.com/demo-pkg: cannot find module providing package example.com/demo-pkg: unrecognized import path "example.com/demo-pkg": reading https://example.com/demo-pkg?go-get=1: 404 Not Found
終了ステータスは1
で、実行に失敗しました。
$ echo $?
1
tests/go.mod
の中身も、MySQLドライバーが残ったままです。
module example.com/tests
go 1.23.1
require github.com/google/go-cmp v0.6.0
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
)
go mod tidy -e
(成功)
本題の-e
オプションをつけてみましょう。
$ go mod tidy -e
go: finding module for package example.com/demo-pkg
go: example.com/tests tested by
example.com/tests.test imports
example.com/demo-pkg: cannot find module providing package example.com/demo-pkg: unrecognized import path "example.com/demo-pkg": reading https://example.com/demo-pkg?go-get=1: 404 Not Found
終了ステータスは0
、正常終了です。
$ echo $?
0
tests/go.mod
を見てみると、使用しているgo-cmp
のみが残りました。
module example.com/tests
go 1.23.1
require github.com/google/go-cmp v0.6.0
まとめ
go mod tidy
の-e
オプションを紹介しました。
workspaceと併用できないのは非常に不便ですので、同じ事象でお困りの方の助けになれば幸いです。