使用Serverless Framework开发AWS Lambda时引入本地npm库的问题
我之前在Serverless上部署Lambda时也踩过一模一样的坑!你用npm install ../libs本地安装自制库后,虽然package.json里能看到依赖,但部署到AWS后Lambda运行时找不到这个库对吧?核心原因是Serverless默认打包逻辑不会自动包含本地路径依赖的完整代码——它只会处理从npm registry拉取的包,而本地路径安装的包在node_modules里其实是一个软链接或者仅包含引用信息,没有把libs里的实际代码复制进来,AWS环境里根本没有你的本地../libs目录,自然就报错了。
下面给你几个亲测有效的解决办法:
方法1:修改Serverless配置,手动包含本地库代码
在你的Serverless项目根目录的serverless.yml里,找到package配置段(没有的话就新建),添加路径规则把你的本地库包含进打包文件:
package: patterns: # 保留默认的node_modules打包规则 - 'node_modules/**' # 把你的本地libs目录加入打包范围,注意路径要和你install时的相对路径一致 - '../libs/**'
⚠️ 注意:如果你的libs目录里有node_modules或者其他不需要打包的文件,可以再添加排除规则,比如- '!../libs/node_modules/**',避免打包冗余文件增大部署包体积。
方法2:把本地库打包成tar包后安装
这种方法能让你的本地库像普通npm包一样被完整复制到项目的node_modules里,Serverless打包时会自动包含:
- 先进入你的本地libs目录,执行打包命令:
npm pack
这会生成一个类似your-lib-name-1.0.0.tgz的压缩包。
2. 回到Lambda项目目录,用这个tar包安装依赖:
npm install ../libs/your-lib-name-1.0.0.tgz
现在你的项目node_modules里就有这个库的完整代码了,部署时Serverless会把它一起打包上传到AWS。
方法3:使用Serverless插件自动处理本地依赖
如果经常需要处理本地自定义库,可以试试serverless-local-deps插件,它能自动识别本地路径依赖并打包:
- 安装插件:
serverless plugin install -n serverless-local-deps
- 在
serverless.yml里启用插件:
plugins: - serverless-local-deps
插件会自动处理所有file:开头的本地依赖,把对应的代码复制到打包目录里,不用手动写路径规则。
额外注意事项
- 检查你的Lambda代码里引用库的路径是否正确,比如如果你的libs的package.json里
main字段指向index.js,那代码里用require('your-lib-name')就没问题,不要用相对路径引用本地libs目录。 - 确保你的本地库没有依赖仅在本地环境存在的资源(比如Windows下的二进制文件),AWS Lambda运行在Linux环境,跨平台依赖会导致运行报错。
内容的提问来源于stack exchange,提问作者Connor

