Как использовать модули заменить функциональность в облачных функциях

У меня есть облачная функция 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. Я просто догадываюсь здесь жестко.

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