如何解决AppEngine部署找不到Go软件包 关于本地进口的一些信息有关卖方的一些信息
我在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二进制文件,还是捆绑所有文件并在云构建中运行它。
- AppEngine部署工作如何?
- 如何部署AppEngine来查找go.mod文件?
- 如何捆绑依赖项? (如果它确实在CloudBuild上运行,则它无权访问私有存储库)
解决方法
回答您的问题:
AppEngine部署如何工作?
- 您的源文件已上传到Google Cloud Storage。 Cloud Build会构建您的应用并将其部署到App Engine。
如何部署AppEngine来查找go.mod文件?
- 您将模块的go.mod文件与app.yaml文件放在同一目录中。
如何捆绑依赖项?
- 它确实在运行Cloud Build。 App Engine在构建过程中无法下载您的私有依赖项,因此在部署时必须将它们与应用程序代码一起包括在内。详细信息可以在“指定依赖项”文档页面的Using private dependencies段落中找到。
关于文件结构的重构:文件结构需要遵守Structuring your files段落中给出的规定:
-
Go 1.11服务的
- go-app /:目录。
- app.yaml:您的服务的配置设置。
- main.go:您的应用程序代码。
我为其他遇到相同问题的人提供的解决方案。 尽管文档对此有些模棱两可,但似乎存在一些真理。 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文件上方似乎根本没有任何复制。
因此解决方案需要:
- 每个微服务都有自己的go.mod文件。
- 该go.mod文件与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进行获取。 - 供应商用于将所有依赖项与app.yaml捆绑在同一目录中,以便将它们部署到AppEngine。
关于本地进口的一些信息
Go看起来首先要在依赖项缓存/路径中查找所有内容,然后才在Internet上查找所有内容。
如果我使用go mod edit
创建了本地软件包,则其模块名称为“ shared”。
要告诉Go您要导入而不是使用Internet本地导入,请调用go mod init shared
,
您应该看到go.mod的行像go mod edit -replace=shared=../../shared/
。
如果您使用的是Goland,但仍未编译,请尝试replace shared => ../../shared
有关卖方的一些信息
go.mod文件夹中的 File>Invalidate Caches/Restart...
将捆绑所有依赖项,包括本地依赖项,以便AppEngine可以部署它们。这也是处理私有存储库的好方法,因此您无需git Cloud Build访问您的存储库。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。