我在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被统一。
我不清楚的是,当我运行glcoud app deploy
时,AppEngine是在本地计算机上构建go二进制文件,还是捆绑所有文件并在云构建中运行它。
答案 0 :(得分:1)
回答您的问题:
AppEngine部署如何工作?
如何部署AppEngine来查找go.mod文件?
如何捆绑依赖项?
关于文件结构的重构:文件结构需要遵守Structuring your files段落中给出的规定:
答案 1 :(得分:1)
我为其他遇到相同问题的人提供的解决方案。 尽管文档对此有些模棱两可,但似乎存在一些真理。 docs说:
import dash
import dash_table
import dash_html_components as html
import pandas as pd
df = pd.DataFrame(
[
["California", 289, 4395, 15.3, 10826],
["Arizona", 48, 1078, 22.5, 2550],
["Nevada", 11, 238, 21.6, 557],
["New Mexico", 33, 261, 7.9, 590],
["Colorado", 20, 118, 5.9, 235],
],
columns=["State", "# Solar Plants", "MW", "Mean MW/Plant", "GWh"],
)
app = dash.Dash(__name__)
server = app.server
app.layout = dash_table.DataTable(
id="table",
columns=[{"name": i, "id": i} for i in df.columns],
data=df.to_dict("records"),
export_format="csv",
)
if __name__ == "__main__":
app.run_server(debug=True)
实际上,这似乎并不正确,在app.yaml文件上方似乎根本没有任何复制。
因此解决方案需要:
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.
用于告诉Go编译器在本地查看,而不是尝试通过Internet进行获取。 Go看起来首先要在依赖项缓存/路径中查找所有内容,然后才在Internet上查找所有内容。
如果我使用go mod edit
创建了本地软件包,则其模块名称为“ shared”。
要告诉Go您要导入而不是使用Internet本地导入,请调用go mod init shared
,
您应该看到go.mod的行像go mod edit -replace=shared=../../shared/
。
如果您使用的是Goland,但仍未编译,请尝试replace shared => ../../shared
File>Invalidate Caches/Restart...
将捆绑所有依赖项,包括本地依赖项,以便AppEngine可以部署它们。这也是处理私有存储库的好方法,因此您无需git Cloud Build访问您的存储库。