指定依附元件

在 Go 1.12 以上標準執行階段中執行的應用程式,可以使用任何與 linux/amd64 相容的套件。

App Engine 要求 Go 程式碼中的所有匯入陳述式都必須指定絕對路徑。例如使用下列指令進行匯入:

import "github.com/example/mypackage"

使用 Go 模組

建議您使用 Go 模組來管理 Go 應用程式中的依附元件。如果您尚未準備好遷移至 Go 模組,可以繼續使用舊版 GOPATH 模式。

1.22 以上版本起:

  • 在舊版 GOPATH 模式 (GO111MODULE=off) 中,您無法在模組外部使用 go get。詳情請參閱「工具」。

  • Go 建議您使用 go.mod 檔案來管理依附元件。如要在部署期間安裝依附元件,請在 app.yaml 檔案所在的資料夾中加入 go.mod 檔案。如要進一步瞭解 Go 版本,以及如何管理供應商目錄的依附元件,請參閱「GOPATH 和模組」一文。

部署應用程式時,App Engine 會使用 go build 指令建構應用程式,並與 Go 本身的行為相符。為確保應用程式使用 module-aware 模式,請在開發環境中執行下列操作:

  • app.yaml 檔案所在的目錄中,建立模組的 go.mod 檔案。App Engine 會搜尋目前的目錄和後續的父目錄,直到找到 go.mod 檔案為止。

    如果 App Engine 找不到 go.mod 檔案,就會採用 GOPATH 模式。

  • 如果您設定了 GO111MODULE 環境變數,請確認變數值已啟用 module-aware 模式。部署應用程式時,App Engine 會檢查環境是否有 GO111MODULE,並比對 Go 本身的行為。只有在您為應用程式加入 go.mod 檔案時,App Engine 才會套用 GO111MODULE 變數設定。

  • 對於 Go 1.12,請勿在 $GOPATH/src 資料夾中找出應用程式目錄。如果 Go 1.12 應用程式位於 $GOPATH/src 目錄樹狀結構中的任何位置,即使您已為應用程式定義 go.mod 檔案,App Engine 也會採用 GOPATH 模式。

    對於 Go 1.13 以上版本,App Engine 預設會使用 module-aware 模式,除非 GO111MODULE 覆寫預設值,或是應用程式目錄中沒有 go.mod 檔案。

供應商依附元件

供應商會將應用程式使用的套件複製到應用程式目錄,而不是在建構程序期間從來源下載模組。Go 提供 go build 指令,可將應用程式所需的套件提供至應用程式根目錄中名為 vendor 的目錄。

在 Go 1.14 以上版本中,如果應用程式的根目錄包含名為 vendor 的目錄,go build 指令和 App Engine 部署程序會使用供應商目錄中的套件,而非下載模組。

在 Go 1.13 以下版本中,您必須將環境設定為使用 GOPATH 模式,才能使用供應商。

使用私人依附元件

App Engine 無法在建構程序期間下載私人依附元件,因此您必須在部署時將依附元件納入應用程式程式碼。

請在 go.mod 檔案中使用 replace 指令,宣告私人依附元件。以下範例假設您的應用程式位於 /myapp/ 目錄中:

  1. 變更至應用程式目錄:

    cd /myapp
    
  2. 建立包含私有依附元件的目錄:

    mkdir private
    

    請確認私人依附元件位於 private 目錄中。其中一種方法是建立符號連結:

    mkdir private/private.example.com
    ln -s /path/to/private.example.com/foo private/private.example.com/foo
    
  3. 更新 go.mod 檔案,以便使用 replace 指令使用依附元件的 private 目錄:

    go mod edit -replace=private.example.com/foo=./private/private.example.com/foo
    

    您的 go.mod 檔案現在應如下所示:

    最終 go.mod 檔案

    module private.example.com/myapp
    
    require private.example.com/foo v1.2.3
    
    replace private.example.com/foo => ./private/private.example.com/foo
    

    原始 go.mod 檔案

    module private.example.com/myapp
    
    require private.example.com/foo v1.2.3
    
  4. 請勿修改匯入及使用私人套件的做法。您的 import 陳述式應如下所示:

    import "private.example.com/foo"
    
  5. 部署應用程式時,在部署作業中加入私人依附元件:

    gcloud app deploy