cellbang / malagu

Malagu is a Serverless First, componentized, platform-independent progressive application framework based on TypeScript. Malagu 是基于 TypeScript 的 Serverless First、组件化、平台无关的渐进式应用框架。
https://malagu.naily.cc
MIT License
696 stars 60 forks source link

[RFC] 支持pnpm monorepo #182

Closed bingtsingw closed 1 year ago

bingtsingw commented 1 year ago

一个典型的monorepo项目结构如下:

my-monorepo
├─ apps
│  ├─ api
│  └─ mobile
├─ packages
│  └─ shared-utils
└─ docs

如果在apps/api目录下运行 malagu build, 会在apps/api/.malagu/dist/backend目录下构建并运行pnpm install, 但是由于是在workspace环境里执行的pnpm install, 所以node_modules里的包会链接到{workspaceRoot}/node_modules/.pnpm目录, 无法打包上传到服务器.

bingtsingw commented 1 year ago

解决方案

查了好久资料, 找到一个可能可行的解决方案:

pnpm提供了一个命令pnpm deploy来解决在monorepo安装包的链接问题: https://pnpm.io/cli/deploy, 所以在pnpm monorepo项目里构建malagu build时, 应该用pnpm deploy代替pnpm install, 我们可以用--filter选项来开启这个功能

malagu.yml

packager: pnpm

malagu:
  packagerOptions:
    filter: @mono/api

执行如下流程代替 pnpm install --filter @mono/api

pnpm --filter @mono/api --prod deploy .pnpm-deploy-target
cp -R .pnpm-deploy-target/node_modules .
rm -rf .pnpm-deploy-target
bingtsingw commented 1 year ago

不过在pnpm workspace里, 不管是执行install还是deploy, packExternalModules过程实际上是无效的, 因为它不会从生成的.malagu/dist/backend/package.json文件去读取信息, 而是总会从@packages/**/package.json文件读取信息

bingtsingw commented 1 year ago

参考资料: https://github.com/pnpm/pnpm/issues/3114