Развертывание go1.11 при сбое стандартной сборки App Engine: ваше приложение отсутствует на вашем GOPATH

Я попытался развернуть свое приложение Go в App Engine. У меня следующие ошибки сборки:

Starting Step #1 - "builder"
Step #1 - "builder": Pulling image: gcr.io/gae-runtimes/go111_app_builder:go111_1_11runtime: go111
handlers:
- url: /api/user
  script: auto

- url: /favicon.ico
  static_files: build/favicon.ico
  upload: build/favicon.ico

- url: /
  static_files: build/index.html
  upload: build/index.html

- url: /
  static_dir: build
20181111_RC00 Step #1 - "builder": go111_1_11runtime: go111 handlers: - url: /api/user script: auto - url: /favicon.ico static_files: build/favicon.ico upload: build/favicon.ico - url: / static_files: build/index.html upload: build/index.html - url: / static_dir: build 20181111_RC00: Pulling from gae-runtimes/go111_app_builder Step #1 - "builder": Digest: sha256:51fb36bfa16e7013356867c3a3972986084df93e56258fc258579a5799f0436e Step #1 - "builder": Status: Downloaded newer image for gcr.io/gae-runtimes/go111_app_builder:go111_1_11runtime: go111 handlers: - url: /api/user script: auto - url: /favicon.ico static_files: build/favicon.ico upload: build/favicon.ico - url: / static_files: build/index.html upload: build/index.html - url: / static_dir: build 20181111_RC00 Step #1 - "builder": 2018/11/24 18:13:29 Your app is not on your GOPATH, this build may fail. Step #1 - "builder": 2018/11/24 18:13:29 Building from Go source in /tmp/staging477638319/srv, with main package at ./... Step #1 - "builder": 2018/11/24 18:13:29 Building /tmp/staging477638319/srv, saving to /tmp/staging477638319/usr/local/bin/start Step #1 - "builder": 2018/11/24 18:13:30 Wrote build output to /builder/outputs/output Step #1 - "builder": 2018/11/24 18:13:30 Failed to build app: Your app is not on your GOPATH, please move it there and try again. Step #1 - "builder": building app with command '[go build -o /tmp/staging477638319/usr/local/bin/start ./...]', env '[PATH=/go/bin:/usr/local/go/bin:/builder/google-cloud-sdk/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=d253e517b16c HOME=/builder/home BUILDER_OUTPUT=/builder/outputs DEBIAN_FRONTEND=noninteractive GOROOT=/usr/local/go/ GOPATH=/go GOPATH=/tmp/staging477638319/srv/gopath]': err=exit status 1, out=srv/main.go:7:2: cannot find package "cloud.google.com/go/firestore" in any of: Step #1 - "builder": /usr/local/go/src/cloud.google.com/go/firestore (from $GOROOT) Step #1 - "builder": /tmp/staging477638319/srv/gopath/src/cloud.google.com/go/firestore (from $GOPATH) Step #1 - "builder": srv/main.go:8:2: cannot find package "github.com/gin-gonic/gin" in any of: Step #1 - "builder": /usr/local/go/src/github.com/gin-gonic/gin (from $GOROOT) Step #1 - "builder": /tmp/staging477638319/srv/gopath/src/github.com/gin-gonic/gin (from $GOPATH) Step #1 - "builder": srv/main.go:9:2: cannot find package "google.golang.org/api/option" in any of: Step #1 - "builder": /usr/local/go/src/google.golang.org/api/option (from $GOROOT) Step #1 - "builder": /tmp/staging477638319/srv/gopath/src/google.golang.org/api/option (from $GOPATH) Finished Step #1 - "builder" ERROR ERROR: build step 1 "gcr.io/gae-runtimes/go111_app_builder:go111_1_11runtime: go111 handlers: - url: /api/user script: auto - url: /favicon.ico static_files: build/favicon.ico upload: build/favicon.ico - url: / static_files: build/index.html upload: build/index.html - url: / static_dir: build 20181111_RC00" failed: exit status 1

Мой файл app.yaml выглядит так:

runtime: go111
handlers:
- url: /api/user
  script: auto

- url: /favicon.ico
  static_files: build/favicon.ico
  upload: build/favicon.ico

- url: /
  static_files: build/index.html
  upload: build/index.html

- url: /
  static_dir: build

Мой файл main.go в корне выглядит так:

package main

import (
    "context"
    "net/http"

    "cloud.google.com/go/firestore"
    "github.com/gin-gonic/gin"
    "google.golang.org/api/option"
)

const firestoreAccountFile = "firebase.json"
const firestoreProjectID = "golang-gae-firestore-template"

type formData struct {
    Name  string `json:"name" binding:"required"`
    Email string `json:"email" binding:"required"`
}

func main() {
    // Gin init
    r := gin.Default()
    // Serve from static build directory
    r.StaticFS("/", http.Dir("./build"))
    // routes
    r.POST("/api/user", userHandler)
    // run application on port 8080
    r.Run(":8080")
}

func writeLogIfError(c *gin.Context, err error) {
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    }
}

func getNewFirestoreClient(ctx context.Context) (*firestore.Client, error) {
    return firestore.NewClient(ctx, firestoreProjectID, option.WithServiceAccountFile(firestoreAccountFile))
}

func userHandler(c *gin.Context) {
    ctx := context.Background()

    client, err := getNewFirestoreClient(ctx)
    writeLogIfError(c, err)
    defer client.Close()
    // Get form data
    var form formData
    c.BindJSON(&form)

    // [START add user to firestore]
    _, _, err = client.Collection("users").Add(ctx, map[string]interface{}{
        "name":  form.Name,
        "email": form.Email,
    })
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    // [END add user to firestore]
    c.JSON(http.StatusOK, gin.H{"status": "user added to db"})
}

Я не могу успешно построить без этих ошибок сборки. Я попытался точно следовать документации по Go on App Engine, и меня смущает, если я структурирую свое приложение иначе, чем было предложено. Есть мысли о том, как решить эту ошибку GOPATH?


person daviddavis    schedule 24.11.2018    source источник


Ответы (2)


Обновление: мне не удалось успешно развернуть с помощью GOPATH, и вместо этого я успешно смог развернуть с помощью go.mod после того, как я включил переменную env: export GO111MODULE = on, чтобы модули работали. Документация здесь: https://github.com/golang/go/wiki/Modules .

person daviddavis    schedule 27.11.2018
comment
Это все еще работает? Я все еще получаю: не могу найти пакет cloud.google.com/go/firestore - person Jason; 29.03.2019
comment
Да, работает. После инициализации не забудьте вытащить модуль с помощью go get firebase.google.com/go, а затем развернуть функции gcloud ... - person bel; 11.04.2020

Для меня это сработало: мое приложение было помещено в папку GOPATH/src/, чтобы оно находилось там вместе со сторонними зависимостями.

https://cloud.google.com/appengine/docs/standard/go111/specifying-dependencies

говорит:

Если ваше приложение находится в каталоге в переменной среды GOPATH, App Engine анализирует, копирует и выгружает ваши импортированные из GOPATH данные.

- что сбивало с толку, т.е. я сначала попытался поместить свое приложение в папку GOPATH, но это не сработало.

Итак, учитывая, что ваша папка GOPATH C:\go, ваш проект должен быть структурирован следующим образом:

- C
  - go
     - pkg
     - src
         - cloud.google.com
         - github.com
         - google.golang.org
         - your-app
person Eugene    schedule 04.11.2019