pnpm workspaceでのモノレポ化を進めているけど、
Cloud Functions for Firebaseがうまくデプロイできなかったので、
いろいろ調べてみたときの備忘録(*´ω`*)
package.json
に"workspace:^"
があるとダメっぽい。
ディレクトリ構成
ディレクトリ構成はこんな感じ。
functionsからcommon-tsを参照している形。
packages/ common-ts/ functions/ lib/ index.js src/ index.ts package.json tsconfig.json package.json pnpm-workspace.yaml
発生したエラー
firebase deploy
を実行してみるとこんな感じのエラーが。。
$ firebase deploy --only functions Build failed: npm ERR! code EUNSUPPORTEDPROTOCOL npm ERR! Unsupported URL Type "workspace:": workspace:^ npm ERR! A complete log of this run can be found in: /www-data-home/.npm/_logs/2023-12-16T04_48_38_227Z-debug-0.log; Error ID: b0ba1f57 Build failed: npm ERR! code EUNSUPPORTEDPROTOCOL npm ERR! Unsupported URL Type "workspace:": workspace:^
functions/package.json
のこの部分がいけないらしい。。
{ "devDependencies": { "@myapp/commons-ts": "workspace:^", } }
やったこと
firebaseに関係ないところでビルドし、
functions/lib/package.json
を配置することで対応した。
firebase.json
の変更
predeploy
をせず、直接packages/functions/lib
を見るように変更
{ "functions": { - "source": "packages/functions", - "predeploy": "npm --prefix \"$RESOURCE_DIR\" run build" + "source": "packages/functions/lib" }, }
functions/package.json
の変更
ビルドしたあとに、"workspace:"
の行を除いたpackage.json
を
lib/
配下に配置するように変更。
package.json
の場所が変わるので、main
のパスも変更する。
{ "scripts": { - "build": "rm -rf lib && tsc --project tsconfig.build.json" + "build": "rm -rf lib && tsc --project tsconfig.build.json && pnpm gen:json", + "gen:json": "cat package.json | sed '/workspace:/d' > lib/package.json" }, - "main": "lib/index.js", + "main": "index.js", "devDependencies": { "@myapp/commons-ts": "workspace:^", } }
jsonをパースして最小限のjsonを吐き出すのがスマートだけど、
sedだけでも十分なので簡易的で低コストな対応にした。
ビルド&デプロイ
あとは、ビルドしてからデプロイすればOK
$ pnpm build -F functions $ firebase deploy --only functions
firebase.json
から、predeploy
を除いたので、
firebase deploy
だけではビルドされないので注意。
以上!!これで、モノレポ化が進む。。(*´ω`*)