如何从npm workspaces目录创建Lambda独立Node包归档
npm workspaces monorepo 打包Lambda依赖缺失解决方案
不需要把代码复制到monorepo外的新目录,有两种可直接落地的处理方式,解决依赖提升导致的打包缺依赖问题:
方法1:配置nohoist规则禁止lambda包的依赖被提升
直接修改仓库根目录的package.json,在workspaces配置项中添加nohoist规则,指定lambda包下的所有依赖不参与全局提升:
{ "workspaces": { "packages": ["packages/*"], "nohoist": [ "packages/lambda/**", "packages/lambda/**/**" ] } }
配置完成后,删除根目录、lambda目录下的node_modules文件夹和锁文件,重新执行npm install即可。配置后lambda包的所有依赖(包括子依赖)都会完整安装在./packages/lambda/node_modules目录下,不会被提升到根目录,后续打包直接压缩lambda目录内容即可。
注意:两条通配规则需要同时配置,第一条匹配lambda包的直接依赖,第二条匹配依赖的子依赖,避免出现部分子依赖仍被提升的问题。
方法2:单独在lambda目录下安装生产依赖(不修改全局配置)
如果不想调整整个monorepo的依赖提升规则,不需要修改根目录配置,直接进入./packages/lambda目录执行安装命令即可:
cd packages/lambda npm install --production --install-links
参数说明:
--production:仅安装dependencies下的运行时依赖,跳过devDependencies,符合Lambda运行环境要求,同时能减小最终包体积--install-links:将所有被提升到根目录的依赖、本地workspace软链依赖,都以实体文件的形式安装到当前包的node_modules下,不会保留指向根目录的软链接,避免Lambda环境找不到依赖。
打包校验
安装完成后可以随机抽查几个./packages/lambda/node_modules下的依赖目录,确认不是软链接形式,之后直接在lambda目录下执行打包即可,示例命令:
zip -r lambda-deploy.zip . -x "*.ts" "*.test.*" "node_modules/.cache/*"
生成的lambda-deploy.zip包含所有运行需要的代码和依赖,可直接上传到AWS Lambda使用。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

