go mod tidyが次のようなのエラーで失敗するとき、エラーを解決するメモ。
$ go mod tidy
github.com/budougumi0617/til/go/tui/promptui imports
github.com/manifoldco/promptui imports
github.com/alecthomas/gometalinter imports
gopkg.in/alecthomas/kingpin.v3-unstable imports
github.com/nicksnyder/go-i18n/i18n: module github.com/nicksnyder/go-i18n@latest (v2.0.2+incompatible) found, but does not contain package github.com/nicksnyder/go-i18n/i18n
TL;DR
go mod tidyコマンドが次のエラーで失敗するようになってしまった。module $MODULE_NAME@latest (v2.0.2+incompatible) found, but does not contain package MODULE_NAME
- 間接依存しているパッケージ
v2ディレクトリを作ってgo.modファイルを削除したのが原因 go.modファイル内で明示的にv1系のバージョンを指定すればばよい。
なお、実行環境は以下。
$ go version
go version go1.13 darwin/amd64
エラー
以下のようなmain.goファイルと、go.modファイルを用意する。
package main
import (
"fmt"
"github.com/manifoldco/promptui"
)
func main() {
fmt.Println(promptui.KeyEnter)
}
module github.com/budougumi0617/til/go/tui/promptui
go 1.13
require (
github.com/BurntSushi/toml v0.3.1 // indirect
github.com/alecthomas/units v0.0.0-20190910110746-680d30ca3117 // indirect
github.com/manifoldco/promptui v0.3.2
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c // indirect
)
このふたつのファイルは(あまり意味のある結果ではないが、)次のように実行できる。
$ go run main.go
13
ただし、go mod tidyをしてgo.modファイルとgo.sumファイルを整理しようとすると、以下のエラーが発生してgo mod tidyが完了しない。
$ go mod tidy
github.com/budougumi0617/til/go/tui/promptui imports
github.com/manifoldco/promptui imports
github.com/alecthomas/gometalinter imports
gopkg.in/alecthomas/kingpin.v3-unstable imports
github.com/nicksnyder/go-i18n/i18n: module github.com/nicksnyder/go-i18n@latest (v2.0.2+incompatible) found, but does not contain package github.com/nicksnyder/go-i18n/i18n
does not contain packageの原因
エラーの発生原因となるgithub.com/nicksnyder/go-i18nパッケージのコードを確認してみる。
GitHubで確認すればわかるとおり、2019/09/20現在、上記のパッケージのlatesetはv2ディレクトリ構成になっており、go.modファイルがなくなっている。
tree -L 1 $GOPATH/src/github.com/nicksnyder/go-i18n
/Users/budougumi0617/go/src/github.com/nicksnyder/go-i18n
├── CHANGELOG.md
├── LICENSE
├── README.md
├── dev.md
└── v2
1 directory, 4 files
そのため、「latestには該当パッケージがない」というエラーメッセージが発生する。
明示的に解決に失敗するモジュールのバージョンを指定する
これを解決するには、v2以降前のバージョンを明示的に指定してあげればよい。
該当パッケージのv1系の最後のバージョンを確認する。
git tag -l "v1.*"
v1.0.0
v1.1.0
v1.10.0
v1.10.1
v1.2.0
v1.3.0
v1.4.0
v1.5.0
v1.6.0
v1.7.0
v1.8.0
v1.8.1
v1.9.0
v1.10.1が最新だったので、これをgo.modファイル内で指定する。
$ go mod edit -require github.com/nicksnyder/go-i18n@v1.10.1
$ cat go.mod
module github.com/budougumi0617/til/go/tui/promptui
go 1.13
require (
github.com/BurntSushi/toml v0.3.1 // indirect
github.com/alecthomas/units v0.0.0-20190910110746-680d30ca3117 // indirect
github.com/manifoldco/promptui v0.3.2
github.com/nicksnyder/go-i18n v1.10.1
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c // indirect
)
こうして明示的にバージョンを指定すると、go mod tidyコマンドが成功するようになる。
$ go mod tidy
$ cat go.mod
module github.com/budougumi0617/til/go/tui/promptui
go 1.13
require (
github.com/BurntSushi/toml v0.3.1 // indirect
github.com/alecthomas/units v0.0.0-20190910110746-680d30ca3117 // indirect
github.com/manifoldco/promptui v0.3.2
github.com/nicksnyder/go-i18n v1.10.1 // indirect
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c // indirect
)
終わりに
いつもエディタで直接編集してしまうが、go mod editコマンドを始めて使った。
直接編集もそんなに苦労しないので、これは覚えなくてもいいかな…
また、replaceを使って該当パッケージをv2の方へ向けるとgo mod tidyコマンドのせいでビルドが失敗するgo.modファイルができるようになるので、これはissueを立ててみようと思う(不適切なreplaceならばエラーで終わってほしい)。