Как использовать модули заменить функциональность в облачных функциях
У меня есть облачная функция Google, которая является подкаталогом в хранилище. Он использует опцию "Каталог с исходным кодом" в меню настроек. Я продолжаю получать эту ошибку при развертывании:
Deployment failure:
Build failed: go: parsing /utils/pubsub/go.mod: open /utils/pubsub/go.mod: no such file or directory
go: error loading module requirements
Я предполагаю, что GCF загружает не весь каталог в экземпляр, а только папку? Это нарушает функциональность замены модулей Go. Есть ли что-то, что я делаю не так?
Ссылка на репо: https://github.com/FreekingDean/jeffbotgo/tree/5d735cc/slackevent
2 ответа
Я работаю в Google и над этим продуктом.
Только каталог, в котором вы работаете gcloud
загружен Нет никакого промежуточного этапа, кроме архивации текущего каталога и его загрузки.
Примечательно, что модули предпочитаются сборщиком по сравнению с поставщиком. Если есть go.mod
, модули будут использоваться. Когда вы загружаете свою функцию, она включает в себя только каталог с вашей функцией в корне, а не каталоги на один уровень выше. Итак, когда есть go.mod
и у вас есть директива замены, указывающая на один уровень вверх, она не будет работать.
Решением на данный момент с этим макетом является поставщик, а не загрузка go.mod
/go.sum
файлы. Когда используешь gcloud
Вы можете создать .gcloudignore
файл, чтобы сделать это для вас. См. https://cloud.google.com/functions/docs/concepts/go-runtime для получения более подробной информации. В качестве альтернативы, измените ваш проект, включив в него все необходимые вспомогательные пакеты в подкаталогах.
У меня была такая же проблема сегодня.
Читая документацию в восьмой раз, я наткнулся на окно с предупреждением под заголовком "Каталог поставщиков".
Предупреждение: если в вашем проекте есть файл go.mod и каталог vendor в корне вашего проекта, каталог vendor будет игнорироваться во время развертывания. Вы должны использовать файл.gcloudignore, чтобы игнорировать файл go.mod, чтобы убедиться, что каталог вашего поставщика используется во время развертывания.
В общем, как только я добавил файл.gcloudignore с помощью go.mod (также добавит go.sum), все заработало. Так что я думаю, что если у вас есть файл go.mod, облачная функция будет пытаться получить зависимости вместо того, чтобы использовать зависимости, загруженные в папку vendor. Я просто догадываюсь здесь жестко.