2020/02/29 現在この記事のやり方ではデプロイできません。下記、リンク参照
govendorで依存関係のファイルが取得できないエラーについて
go modulesを使用したやり方
サードパッケージを使用したGoのアプリケーションをHerokuにデプロイする v2
概要
Portfolioを作るに当たってGoでHerokuにデプロイしようとしたらハマった
結論からいうとパッケージのコミット漏れ
Herokuで公式HPにデプロイ方法は載っていたが、サードパッケージを使用した際はハマるので今回の事象を押さえておく
#Goでアプリケーションを作成
今回はginでプロジェクトを作成する
Heroku用のフォルダを作成し、以下のファイルを配置
package main
import (
"github.com/gin-gonic/gin"
)
type User struct {
Name string
Age int
}
func main() {
router := gin.Default()
// css、js などの静的ファイルを読み込む場合。今回は使用しない。
// router.Static("/assets", "./assets")
router.LoadHTMLGlob("templates/*.html")
router.GET("/", handler)
router.Run()
}
func handler(ctx *gin.Context) {
user := User{"User", 20}
ctx.HTML(200, "index.html", gin.H{
"user": user,
})
}
<!DOCTYPE html>
<html>
<div>
<p>Name: {{.user.Name}} </p>
<p>Age: {{.user.Age}} </p>
</div>
</html>
#govendorを使用してサードパッケージを追加
govendor をインストールしてから行ってください。
https://github.com/kardianos/govendor
govendorについては下記の記事がとても理解できたので参考にさせて頂きました。
Heroku への Go 言語製アプリケーションのデプロイと依存パッケージ管理方法の比較
# 初期化
$ govendor init
# 依存パッケージのダウンロード
$ govendor fetch +out
後はHeroku公式のコマンド通り、コミット→プッシュを行う
$ git init && git add -A .
Initialized empty Git repository in /Users/kazu/workspace/go/src/Heroku/.git/
$ git commit -m "init"
create mode 100644 main.go
create mode 100644 templates/index.html
〜〜〜 以下、vendor配下のファイル 〜〜〜〜〜〜
create mode 100644 vendor/***
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
create mode 100644 vendor/vendor.json
Herokuのアプリを作成
$ heroku create
Creating app... done, ⬢ ancient-mesa-82891
https://ancient-mesa-82891.herokuapp.com/ | https://git.heroku.com/ancient-mesa-82891.git
$ git push heroku master
Goのアプリケーションのデプロイ完了
ちなみにpushする際にgovendor fetch +out
のコマンドを実行していない場合、下記のようなエラーが出る。
-----> Go app detected
-----> Fetching jq... done
-----> Fetching stdlib.sh.v8... done
-----> Checking vendor/vendor.json file.
!! The 'heroku.goVersion' field is not specified in 'vendor/vendor.json'.
!!
!! Defaulting to go1.12.12
!!
!! For more details see: https://devcenter.heroku.com/articles/go-apps-with-govendor#build-configuration
!!
-----> New Go Version, clearing old cache
-----> Installing go1.12.12
-----> Fetching go1.12.12.linux-amd64.tar.gz... done
-----> Fetching govendor... done
!! Installing package '.' (default)
!!
!! To install a different package spec set 'heroku.install' in 'vendor/vendor.json'
!!
!! For more details see: https://devcenter.heroku.com/articles/go-apps-with-govendor#build-configuration
!!
-----> Fetching any unsaved dependencies (govendor sync)
-----> Running: go install -v -tags heroku .
main.go:4:2: cannot find package "github.com/gin-gonic/gin" in any of:
/tmp/tmp.hTplalCHiU/.go/src/Portfolio/vendor/github.com/gin-gonic/gin (vendor tree)
/app/tmp/cache/go1.12.12/go/src/github.com/gin-gonic/gin (from $GOROOT)
/tmp/tmp.hTplalCHiU/.go/src/github.com/gin-gonic/gin (from $GOPATH)
! Push rejected, failed to compile Go app.
! Push failed
HerokuのGithubにサードパッケージをコミットできていないためビルドエラー起きてしまうとのことでした。
公式のやり方だけでは静的なアプリケーションをデプロイできてもサードパッケージを使用した際にできないため、少し工夫が必要でした。
GoPathの考え方に慣れていかないとですかね。
#アプリケーション名の変更
Heroku公式の通りに進めていくとアプリケーション名が適当な文字列で作成されてしまい
URLもそのままの文字列になってしまうため、変更したい場合はHerokuのマイページ→設定から変更しましょう。
その場合はgitで作成したリモートのパスを合わせて変更する事を忘れずに