Как развернуть приложение в монорепозитории (Turborepo) с локальными зависимостями в качестве облачной функции Google?

Я перемещаю проект в монорепозиторий (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» имело доступ ко всем необходимым локальным зависимостям?

Можете ли вы уточнить свои «локальные зависимости»? Можете ли вы подробно описать структуру вашего проекта и все необходимые компоненты для правильного развертывания ваших облачных функций?

guillaume blaquiere 27.04.2023 08:32

Это та же проблема для любого проекта, который поддерживается в монорепозитории и зависит от дочерних пакетов, которые также находятся в монорепозитории. На эти дочерние проекты можно ссылаться локально в package.json как на зависимости, не публикуя их, например, в npm. Вместо номера версии в package.json (например, "my-library": "^0.0.1") они будут указаны "my-library": "workspace:*". Эти последние ссылки не радуют сборщика gcloud, потому что он ничего не знает о «рабочем пространстве: *». Ответ (ниже) заключался в том, чтобы «упаковать pnpm» проект, скопировать его в GCS, а затем развернуть с флагом --source.

Aadmaa 28.04.2023 17:08
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
2
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В случае, если кто-то еще ищет решение, самый простой способ сделать эту работу:

  1. Запустите пакет pnpm, который выведет файл .tgz с вашим проектом.
pnpm pack
  1. Преобразуйте файл tgz в zip-файл. Это необходимо для использования флага --source. Вы можете сделать это с помощью различных инструментов tar и zip. Я запускаю небольшой контейнер со сценарием bash для преобразования, поэтому я могу автоматизировать процесс развертывания. После распаковки войдите в папку «package» и заархивируйте файлы оттуда. Если у вас возникли проблемы, проверьте, что вы включаете в .zip.

Заархивированный проект может выглядеть так. «.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"
  }
}
  1. Загрузить в корзину GCP
gsutil cp myfunction.zip gs://some-bucket/build
  1. Развернуть с флагом --source
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:*» в монорепозитории.

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