My External Storage

Sep 20, 2019 - 3 minute read - Comments - go

go mod tidyするとmodule ... found, but does not contain package ...エラーで失敗する

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現在、上記のパッケージのlatesetv2ディレクトリ構成になっており、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ならばエラーで終わってほしい)。

関連記事