关于在使用Google Cloud Functions时,使用Go语言时的外部依赖问题

关于外部依赖包

虽然可能与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)

我认为只要按照这个问题的Git存储库设置,就不会出现错误。

由于只是想试着运行一下,所以不想创建存储库,因此以下是解决方案。

# 引数としてモジュール名にあたるものを渡してあげる
$ go mod init helloWold

可以查看命令的帮助信息。

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
· go.mod → go模块
· go.sum → go依赖总结

当进行部署时。
而且,将测试文件放置进去后也被部署了。

关于供应方

可以使用以前的vendoring技术来达到相同的目的。
执行下面的命令会在目录中创建一个vendor目录,并将其用于构建。

$ go mod vendor

在直接构建时还可以作为选项进行指定。

$ 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年2月12日,我误解了上述内容。

在GCF的GUI中查看源代码选项卡时,未显示vendor目录。但当从实际下载源码并解压后确认时,vendor目录是存在的。

关于先前的vendoring和模块化

这里很有参考价值。

https://github.com/golang/go/wiki/Modules – 此链接指向Golang的官方Wiki页面,介绍了模块系统的相关信息。
https://research.swtch.com/vgo-module – 此链接指向一个关于vgo模块的研究报告,讨论了模块系统的一些特性和用法。
https://www.reddit.com/r/golang/comments/9ai79z/correct_usage_of_go_modules_vendor_still_connects/ – 此链接指向Golang的Reddit论坛,讨论了模块系统中vendor文件夹的正确用法。

广告
将在 10 秒后关闭
bannerAds