備忘:heroku で go.mod 環境のアプリをデプロイする

概要

heroku が go.mod 対応のアプリにも対応しているので、もう dep とかいらないや、とか思ってたらハマったのでメモ。

ハマりポイント

  • Go のバージョンをアプリのバージョンと合わせる事
  • install するアプリのターゲットが直下にないときはそれを指定しなければいけない事

解説

Go のバージョンについて

heroku がデフォルトで用いる Go のバージョンは 1.12.17 です。

Go の mod 環境は 1.11 から試験導入されて、1.13 からデフォルトになってます。過渡期の問題として、go.sum の計算方法が修正されたりして(GO 1.11.2, 1.11.4 あたり)多少の混乱があったわけですが、バージョン違いで特に問題になるという認識はありませんでした。ところが、heorku は Go 1.14 で作成した go.sum をうまく解決してくれませんでした。原因となるような現象を探せませんでしたが、ビルドする Go のバージョンをそろえたらうまくいったので多分これが原因だと思います。Go のバージョンをセットするには環境変数$GOVERSION=go.1.14 とすればいいです。実際には heroku 画面の Settings -> Config Vars で設定できます。

f:id:ikawaha:20200809094342p:plain

app.json では env に設定できます。

{
    "name": "kagome",
    "description": "Kagome Japanese Morphological Analyzer",
    "env": {
        "GOVERSION": "go1.14",
        "GO_INSTALL_PACKAGE_SPEC": "./cmd/kagome"
    },
    "buildpacks": [
        {
            "url": "https://github.com/heroku/heroku-buildpack-go.git"
        },
        {
            "url": "https://github.com/weibeld/heroku-buildpack-graphviz.git"
        }
    ],
    "stack": "heroku-18"
}

Install のターゲットについて

heroku はレポジトリ直下に main.go があることを想定しています。そうでない場合には GO_INSTALL_PACKAGE_SPEC でインストールするターゲットを指定してやる必要があります。

その他

  • Procfile は必要
  • app.json はアプリのデプロイ時には読んでくれない?
  • コンテナをデプロイした方がよいのでは?

Happy hacking!