我在monorepo中有一个AppEngine微服务设置,服务之间有共享代码,所以我重新分解以统一我的go模块(它们非常相似)。重构在本地工作,构建和运行,Goland愉快地编译。我的问题是,AppEngine部署不再工作,接收诸如:
Error message: cmd/main.go:4:2: cannot find package "github.com/gin-gonic/gin" in any of:
/usr/local/go/src/github.com/gin-gonic/gin (from $GOROOT)
/layers/google.go.appengine_gopath/gopath/src/github.com/gin-gonic/gin (from $GOPATH)
cmd/main.go:5:2: cannot find package "mymodulename/customer/internal/mypkg" in any of:
/usr/local/go/src/mymodulename/customer/internal/cauth (from $GOROOT)
/layers/google.go.appengine_gopath/gopath/src/mymodulename/customer/internal/mypkg (from $GOPATH)原始结构
> svc1
> cmd/main.go
> internal
>utils/shared.go
>mypkg
> go.mod
> app.yaml
> svc2
> cmd/main.go
> internal
>utils/shared.go
>mypkg
> go.mod
> app.yaml重构后的
> svc1
> cmd/main.go
> internal
>mypkg
> app.yaml
> svc2
> cmd/main.go
> internal
>mypkg
> app.yaml
> internal (common shared stuff)
> utils/shared.go
go.mod关键点是utils/shared.go被移动到每个服务目录的外部,并统一了go.mod。
我不清楚的是,AppEngine是在运行glcoud app deploy时在本地机器上构建go二进制文件,还是在云构建中打包并运行它。
发布于 2020-09-30 00:50:46
我为其他有同样问题的人找到的解决方案。一些事实似乎是存在的,尽管文档对此有点模棱两可。文档说:
Create your module's go.mod file in the same directory as your app.yaml file. App Engine searches the current directory, then successive parent directories until it finds a go.mod file.但这似乎不是真的,事实上,在app.yaml文件之上似乎没有任何东西被复制。
因此,解决方案需要:
go mod edit用于告诉Go编译器在本地查找,而不是尝试通过internet进行检索。关于本地进口的一点
Go似乎首先在依赖项缓存/路径中查找所有内容,然后完全在internet上查找。如果我使用go mod init shared创建本地包,它的模块名是“shared”。要告诉Go您想要在本地导入而不是使用internet,请调用go mod edit -replace=shared=../../shared/,您应该看到您的go.mod获得了类似于replace shared => ../../shared的一行。如果您使用的是Goland,但它仍未编译,请尝试File>Invalidate Caches/Restart...
关于销售的一点
您的go mod vendor文件夹中的go.mod将绑定所有依赖项,包括本地依赖项,以便由AppEngine部署它们。这也是一个很好的方式来处理私人回购,所以你不需要git云构建访问你的回购。
发布于 2020-09-29 20:11:20
https://stackoverflow.com/questions/64119757
复制相似问题