Развертывание в google app engine, гибкое с помощью go.mod, завершается неудачно, поскольку он ищет зависимые библиотеки в GOPATH

У меня есть приложение helloworld отсюда с парой модификаций.

  1. Я использовал logrus (чтобы внести зависимость от внешней библиотеки)
  2. Я добавил go.mod, используя go mod init
  3. У меня есть этот код за пределами моей GOPATH.

Все работает на локальном хосте. Я могу видеть приветственное сообщение на localhost:8080. Когда я пытаюсь выполнить развертывание приложения gcloud, я получаю следующую ошибку:

staging for go1.11
Staging Flex app: failed analyzing /home/.../code/app-engine-gomod: cannot find package "github.com/sirupsen/logrus" in any of:
    ($GOROOT not set)
    /home/.../go/src/github.com/sirupsen/logrus (from $GOPATH)
GOPATH: /home/.../go

Я пробовал с и без go mod vendor не помогает Что я делаю неправильно?

3 ответа

У меня есть обходной путь для вас - это не красиво. Я не знаю, почему движок приложения не пытается разрешить зависимости с помощью модулей go, а просто смотрит в $GOPATH.

Мой обходной путь - просто скопировать соответствующую папку из кэша модулей go обратно в путь Go. Я хотел бы знать, если у кого-то есть лучшее решение.

Ваш мод кеш должен быть в $GOPATH/pkg/mod

Скопируйте нужные зависимости в свой $GOPATH/src папку, и вы должны быть в порядке.

Связанный вопрос, надеюсь, это поможет кому-то. Это привело меня к кроличьей норе, потому что я недавно переключился на модули Go, и GAE жаловалась на ошибку в зависимости, которая была исправлена ​​в новой версии. Я несколько раз обновлял зависимость, она работала нормально при локальном тестировании, но я продолжал получать ту же ошибку на app deploy, В конце концов я понял, что происходит: при локальном запуске кода Go правильно собрал зависимости из кэша модулей go - движок приложения брал его из "старого" местоположения из пути Go. После включения модулей Go go get обновляет только кеш модов.

Согласно документации App Engine Standard и Flex, оба поддерживают среду выполнения Go 1.11. Теперь мы знаем, что Go 1.11 представил экспериментальную поддержку модулей Go, сохраняя совместимость с GOPATH. Однако при использовании модулей Go через go.mod file - подход, представленный для Standard, он вообще не упоминается для Flex.

Итак, для Flex, либо у вас есть все под GOPATH, следуя указаниям в документации, либо придерживайтесь обходного пути, предоставляемого @shrumm.

Чтобы решить эту проблему и лучше контролировать среду выполнения и ее зависимости, я обнаружил, что с помощью customсреда выполнения с предоставленным Dockerfile работает лучше всего. Взгляните на этот проект github для примера установки.

Другие вопросы по тегам