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二进制文件,还是捆绑所有文件并在云构建中运行它。

  1. AppEngine部署工作如何?
  2. 如何部署AppEngine来查找go.mod文件
  3. 如何捆绑依赖项? (如果它确实在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文件上方似乎根本没有任何复制。

因此解决方案需要:

  1. 每个微服务都有自己的go.mod文件。
  2. 该go.mod文件与app.yaml位于同一目录中
  3. 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进行获取。
  4. 供应商用于将所有依赖项与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访问您的存储库。