以前、govendorを使用してHerokuにデプロイするやり方を記事にしました。
サードパッケージを使用したGoのアプリケーションをHerokuにデプロイする
12月くらいにまたHerokuにアプリケーションをデプロイしようとした時にエラーが起きた。
書いた記事が1ヶ月でゴミ記事と化した…
事象
とりまHerokuのエラーログ抜粋
remote: -----> Fetching any unsaved dependencies (govendor sync)
remote: -----> Running: go install -v -tags heroku .
remote: vendor/github.com/gin-gonic/gin/binding/default_validator.go:11:2: cannot find package "github.com/go-playground/validator/v10" in any of:
remote: /tmp/tmp.ZfAOSHHFNh/.go/src/Heroku/vendor/github.com/go-playground/validator/v10 (vendor tree)
remote: /app/tmp/cache/go1.12.16/go/src/github.com/go-playground/validator/v10 (from $GOROOT)
remote: /tmp/tmp.ZfAOSHHFNh/.go/src/github.com/go-playground/validator/v10 (from $GOPATH)
remote: ! Push rejected, failed to compile Go app.
remote:
remote: ! Push failed
remote: Verifying deploy...
remote:
remote: ! Push rejected to pure-harbor-40656.
remote:
To https://git.heroku.com/pure-harbor-40656.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/pure-harbor-40656.git'
エラーの部分は
cannot find package "github.com/go-playground/validator/v10" in any of:
英語力が皆無な私でも言っている意味は分かる
github.com/go-playground/validator/v10
のパッケージがないのだ
なーんだ、パッケージがないのかぁ……
そんな筈はない…
govendor fetch はちゃんとできていたはず
原因を探るため vendor.json を確認したところ
{
"comment": "",
"ignore": "test",
"package": [
{
〜〜割愛〜〜〜〜
{
"path": "github.com/go-playground/validator/v10",
"revision": ""
},
〜〜〜〜〜〜〜〜
}
revisionが空ってどういこと!?取れてないのか??
11月から変えた事と言えばGoのバージョンをあげた事
上記エラーについてあまり情報が転がっていなかったのでパッケージ元を調査しました。
https://github.com/go-playground/validator
Go modulesに移行したとの事
えぇ?いきなり??
確かにGoは1.11からgo module を使用する様に促しています。
https://blog.golang.org/using-go-modules
いや、でもHerokuの公式サイトはgovendorって書いとるやん…
issues
上記エラーは困っている人はたくさんいたらしく、issueも上がっていました。
https://github.com/go-playground/validator/issues/546
苦手な英語をとにかく翻訳(Google頼り)
ざっと流れを説明すると(かなり主観)
エンジニア「Dockerfileとかでエラー起こってるんやけどー?」
開発者様 「バージョンあげて試してみて!!」
エンジニア「validatorがgin-gonic/ginに依存してるからまだ取得できないよー」
開発者様 「go modulesでやって欲しいですー」
エンジニア「govendorでやってるんだよね…」←私と同じ
開発者様 「v10のアップデートはgopkg.inからgo modulesへのバージョン管理の切り替えで…go modulesを使用していない場合はv9を使用している場合はv10を参照する様にしています。」
開発者様 「古いバージョン管理ツールがgo modulesとの互換性がないというコミュニティの悪い状態を解決するためgo modulesを使用することをオススメします。 go moduleにコミュニティが破壊されたよー(泣」
Goのアップデートに対しての処置だったのですね。
なんにせよ、ginを使用している場合はgo modulesに切り替える必要がありそうです。
Herokuもgo modulesでデプロイは可能なので、そちらを使うのをオススメします。
教訓
Goは日本語の記事やドキュメントが少なくて調べるのに苦労しました。英語も超超超苦手なので勉強するいい機会になりました…
Java使ってる時はライブラリは自分でインストール→読み込み→実行だったので、何も考えずにgo getしていた事で気づくのが遅れた感じですかねぇ…
やっぱり自分で使うものはある程度使い方、影響度を理解した上で使わないと!(今更)