nyagos は Windows7, 8.1 もまだサポートしているので、ビルドの要件は Go 1.20.14 だが、AppVeyor ではデフォルトの Go でビルドするようにしていた。
だが、 go fmt
の最後で次のようなエラーになるようになってしまった。
go: downloading github.com/Microsoft/go-winio v0.6.2 go: downloading github.com/rivo/uniseg v0.4.7 go: updates to go.mod needed; to update it: go mod tidy mingw32-make: *** [Makefile:31: snapshot] Error 1
ローカルでも make GO=go.exe
で実行すると再現するのだが、この時は気付かず、Go を 1.20.14 を指定すれば直るだろうと、Goの参照先を 1.20 へ変更してみた。
--- a/appveyor.yml +++ b/appveyor.yml @@ -31,7 +31,7 @@ #- appveyor DownloadFile https://dl.google.com/go/go1.12.windows-386.zip #- 7z x go1.12.windows-386.zip -oC:\ >nul - set "INSTALLDIR=%APPVEYOR_BUILD_FOLDER%\%DEST_DIR%\%PLATFORM%" - - set "PATH=C:\msys64\mingw64\bin;C:\go\bin;%PATH%" + - set "PATH=C:\msys64\mingw64\bin;C:\go120\bin;%PATH%" - set "GOARCH=%PLATFORM:i386=386%" - mkdir "%INSTALLDIR%" > nul 2>&1
が、今度は go build
の方で妙なエラーが出る。なんで、go1.21.8 のライブラリが使われてるんだ?
go: downloading github.com/rivo/uniseg v0.4.7 set "CGO_ENABLED=0" && go build -ldflags "-s -w -X main.version=4.4.15_1-46-g2ef328ec" # internal/unsafeheader compile: version "go1.21.8" does not match go tool version "go1.20.14" # internal/goarch compile: version "go1.21.8" does not match go tool version "go1.20.14" # internal/coverage/rtcov :以下、同じようなエラー
どうも、設定しなくてもよい GOROOT が設定されていて、それが go1.21.8 の方へ向いているように思われた。次のように appveyor.yml にて明示的に GOROOT を go120 を指すようにしたところ、エラーは解消した。
--- a/appveyor.yml +++ b/appveyor.yml @@ -22,6 +22,7 @@ global: dest_dir: bin gopath: C:\Users\appveyor\go + goroot: C:\go120 matrix: - platform: i386 - platform: amd64
なお、最初のエラーメッセージにあるとおり、go mod tidy
を実行することでも直るようだ。これを実行すると、go.mod に toolchain 文が追記される。
--- a/go.mod +++ b/go.mod @@ -1,7 +1,9 @@ module github.com/nyaosorg/nyagos -go 1.19 +go 1.21 +toolchain go1.22.3 + require ( github.com/atotto/clipboard v0.1.4 github.com/dustin/go-humanize v1.0.1
しかし、5月2日までは問題なくビルドできていたのになぁ。その後のこっちの修正はドキュメントしかなかったし。
AppVeyor側で何があったんだろうと思って、Updateを見たが、使っている Visual Studio 2019 ベースのイメージが更新されたのは4月4日で、確かに Go1.22 初登場っぽいが、ちょっと時期が早い。うーむ、わからん。