LoginSignup
15
7

More than 5 years have passed since last update.

GoogleCloudFunctionsでGoを利用した時の外部依存について

Last updated at Posted at 2019-02-04

外部依存パッケージについて

あまり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 を依存させてみる
元のソースはコチラで使用したもの

function.go
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の中身が変更される。

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/

15
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
7