Я перемещаю проект в монорепозиторий (Turborepo с pnpm) и у меня возникают проблемы с развертыванием моих облачных функций Google. Обычно я просто использую интерфейс командной строки gcloud. Например:
call pnpm run build && gcloud functions deploy myCloudFunction \\
--entry-point myMainFunction --env-vars-file .env.yaml \\
--runtime nodejs16 --trigger-topic MY_TOPIC
Однако теперь у меня есть очевидная проблема - в монорепозитории у меня есть локальные зависимости, ссылающиеся на «рабочее пространство: *», поэтому процесс сборки «развертывание функций gcloud» завершается сбоем. Есть ли элегантный способ собрать и упаковать мой код, чтобы «развертывание функций gcloud» имело доступ ко всем необходимым локальным зависимостям?
Это та же проблема для любого проекта, который поддерживается в монорепозитории и зависит от дочерних пакетов, которые также находятся в монорепозитории. На эти дочерние проекты можно ссылаться локально в package.json как на зависимости, не публикуя их, например, в npm. Вместо номера версии в package.json (например, "my-library": "^0.0.1") они будут указаны "my-library": "workspace:*". Эти последние ссылки не радуют сборщика gcloud, потому что он ничего не знает о «рабочем пространстве: *». Ответ (ниже) заключался в том, чтобы «упаковать pnpm» проект, скопировать его в GCS, а затем развернуть с флагом --source.

В случае, если кто-то еще ищет решение, самый простой способ сделать эту работу:
pnpm pack
Заархивированный проект может выглядеть так. «.npmrc» можно использовать, если у вас есть частные пакеты npm для включения. В папке «dist» находится только «index.js», созданный упаковщиком pnpm.
Файл package.json может выглядеть так:
{
"name": "my-cloud-function",
"version": "0.0.1",
"private": true,
"description": "handle various Pub/Sub messages",
"main": "dist/index.js",
"files": [
"dist",
".npmrc"
],
"dependencies": {
[... your dependencies]
},
"license": "UNLICENSED",
"devDependencies": {
"@google-cloud/functions-framework": "^3.2.0",
"@types/express": "^4.17.11",
"@types/node": "^18.11.6"
}
}
gsutil cp myfunction.zip gs://some-bucket/build
gcloud functions deploy myCloudFunction \\
--source gs://some-bucket/myfunction.zip \\
--entry-point myMainFunction --env-vars-file .env.yaml \\
--runtime nodejs16 --trigger-topic MY_TOPIC
Это делает это. Использование «pnpm pack» автоматически упаковывает локальные зависимости, которые упоминаются как «workspace:*» в монорепозитории.
Можете ли вы уточнить свои «локальные зависимости»? Можете ли вы подробно описать структуру вашего проекта и все необходимые компоненты для правильного развертывания ваших облачных функций?