Развертывание в google app engine, гибкое с помощью go.mod, завершается неудачно, поскольку он ищет зависимые библиотеки в GOPATH
У меня есть приложение helloworld отсюда с парой модификаций.
- Я использовал logrus (чтобы внести зависимость от внешней библиотеки)
- Я добавил go.mod, используя go mod init
- У меня есть этот код за пределами моей 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 для примера установки.