外部依存パッケージについて
あまりGoogleCloudFunctionsとは関係ないかもしれませんが、
使う上でどういう挙動になるのかなと思って試してみた。
今まで通りのglideやdepでの管理もできるし、
go1.11のModulesを利用することができる
$ cd helloWorld
$ export GO111MODULE=on
$ go mod init helloWorld
これを実行すると、ディレクトリ内に go.mod
というファイルが作成される
go mod initについて
最初以下で実行したがエラー発生
$ go mod init
go: cannot determine module path for source directory xxxxxxxx(outside GOPATH, no import comments)
https://github.com/golang/go/issues/27951#issuecomment-438274639
ここのissueにあるようにgitのリポジトリ設定がされていればエラーが出ないんだと思う。
でも動かしてみるだけなのでリポジトリ作成したくなかったので以下で対応
# 引数としてモジュール名にあたるものを渡してあげる
$ go mod init helloWold
※commandのヘルプ見てみる
go mod init --help
usage: go mod init [module]
試しに外部依存パッケージを利用してみる
今回は github.com/go-sql-driver/mysql
を依存させてみる
元のソースはコチラで使用したもの
package function
import (
"fmt"
"net/http"
_ "github.com/go-sql-driver/mysql"
)
func HelloWorld(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
そうしたら依存させたモジュールをダウンロードする
$ go mod download
go: finding github.com/go-sql-driver/mysql v1.4.1
go: finding google.golang.org/appengine v1.4.0
go: finding github.com/golang/protobuf v1.2.0
go: finding golang.org/x/text v0.3.0
go: finding golang.org/x/net v0.0.0-20180724234803-3673e40ba225
するとディレクトリ内に新たに go.sum
というファイルができ、go.modの中身が変更される。
module helloWorld
require (
github.com/go-sql-driver/mysql v1.4.1
google.golang.org/appengine v1.4.0 // indirect
)
さらにGOPATH配下に mod
というディレクトリが作成され、そこで外部依存のモジュールが管理されることになる。
# gvmでgoを管理しているのでpkg指定
$ ls $GOPATH/pkg
mod
これで完了。
以前からGoを使ってきた人はvendorディレクトリがないことに気づいたかもしれない。
そうvendorディレクトリがなくなって管理から解放されたのだ。
余談だが、単に go build
を実行しても同じ挙動になった。
デプロイしてみる
gcloud functions deploy helloWorld --entry-point HelloWorld --runtime go111 --trigger-http
デプロイしてCloudFunctionsのコンソールを見てみると
・function.go
・go.mod
・go.sum
がデプロイされる。
さらに、testファイルを置いてみるとそれもデプロイされた。
vendoringについて
以前のvendoringを利用することもできる
以下のコマンドを実行するとディレクトリ内にvendorディレクトリが作成されビルドに利用される。
$ go mod vendor
直接buildする際にオプションとしても指定できる
$ go build -mod vendor
デプロイしてみる
gcloud functions deploy helloWorld --entry-point HelloWorld --runtime go111 --trigger-http
結果、vendorディレクトリはデプロイされなかった。
go.mod, go.sumがあるとvendorディレクトリは無視されるのかな?
試しにgo.mod, go.sumを削除してデプロイしてみる。
やはりvendorディレクトリはデプロイされない。
GCFにとってvendorディレクトリはデプロイ対象ではないみたい。
※もしかしてオプションか何かでデプロイできるのかもしれないので
もしご存知でしたら教えてください。
2019/02/12 追記
上記は自分の勘違いでした。
GCFのGUIでソースタブを見るとvendorディレクトリは表示されていなかったのですが、
実際にソースのダウンロードをして解凍して確認してみると、ちゃんとvendorディレクトリが存在していました。
今までのvendoringとモジュールについて
この辺が参考になった。
https://github.com/golang/go/wiki/Modules
https://research.swtch.com/vgo-module
https://www.reddit.com/r/golang/comments/9ai79z/correct_usage_of_go_modules_vendor_still_connects/