0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

go workspaceで`go mod tidy`が失敗するのを回避する

Last updated at Posted at 2024-10-24

はじめに

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と併用できないのは非常に不便ですので、同じ事象でお困りの方の助けになれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?