亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

AppEngine 部署找不到 Go 包

AppEngine 部署找不到 Go 包

Go
滄海一幻覺 2022-07-04 16:38:14
我在 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 是否在我運行時在我的本地計算機上構建 go 二進制文件,glcoud app deploy或者是否捆綁所有內容并在云構建中運行它。AppEngine 部署如何工作?如何讓 AppEngine 部署找到我的 go.mod 文件?依賴項是如何捆綁的?(如果它在 CloudBuild 上運行,它肯定無權訪問私有存儲庫)
查看完整描述

2 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

我已經為遇到同樣問題的其他人提供了解決方案。一些事實似乎存在,盡管文檔對此有些模棱兩可。文檔說:

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 文件上方似乎根本沒有復制任何內容。

所以解決方案需要:

  1. 每個微服務都有自己的 go.mod 文件。

  2. 該 go.mod 文件與 app.yaml 位于同一目錄中

  3. go mod edit用于告訴 Go 編譯器在本地查找,而不是嘗試通過 Internet 獲取。

  4. 供應商用于將所有依賴項捆綁在與 app.yaml 相同的目錄中,以便將它們部署到 AppEngine。

關于本地進口的一點

Go 似乎首先在依賴項緩存/路徑中查找所有內容,然后完全在 Internet 上查找。如果我使用創建本地包go mod init shared,則其模塊名稱為“共享”。要告訴 Go 你想在本地導入而不是使用互聯網,調用go mod edit -replace=shared=../../shared/,你應該看到你的 go.mod 得到一個類似的行replace shared => ../../shared。如果您使用的是 Goland,但仍然無法編譯,請嘗試File>Invalidate Caches/Restart...

關于供應商的一些信息

go mod vendor在您的 go.mod 文件夾中將捆綁所有依賴項,包括本地依賴項,以便它們可以由 AppEngine 部署。這也是處理私有存儲庫的好方法,因此您無需通過 git Cloud Build 訪問您的存儲庫。


查看完整回答
反對 回復 2022-07-04
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

回答您的問題:

AppEngine 部署如何工作?

  • 您的源文件已上傳到 Google Cloud Storage。Cloud Build 構建您的應用并將其部署到 App Engine。

如何讓 AppEngine 部署找到我的 go.mod 文件?

  • 您將模塊的 go.mod 文件放在與 app.yaml 文件相同的目錄中。

依賴項是如何捆綁的?

  • 它確實在運行 Cloud Build。App Engine 無法在構建過程中下載您的私有依賴項,因此您必須在部署時將它們包含在您的應用程序代碼中。詳細信息可在“指定依賴項”文檔頁面的使用私有依賴項段落中找到。

關于重構文件結構:文件結構需要遵守結構化文件段落中給出的規定:

  • go-app/:Go 1.11 服務的目錄。

    • app.yaml:你的服務的配置設置。

    • main.go:您的應用程序代碼。



查看完整回答
反對 回復 2022-07-04
  • 2 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號