如何让AWS SAM Build忽略Node.js Lambda项目的devDependencies?
问题场景
我用AWS SAM部署Node.js无服务器应用,每个文件夹对应一个独立的Lambda函数。每个函数的package.json里都带devDependencies,但这些依赖完全没必要在SAM Build时打包——我的应用所有依赖都通过Layers管理,根本用不上devDependencies。但sam build默认会安装devDependencies,偏偏这些devDependencies存在私有仓库里,导致每个文件夹都得配.npmrc才能让命令正常执行,实在太折腾了,想问问有没有办法让SAM Build直接忽略devDependencies?
可行解决方案
1. 给单个Lambda函数配置Build参数
在你的template.yaml里,针对每个Lambda函数的资源定义,添加BuildProperties来指定npm安装时只装生产依赖:
Resources: YourLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./path/to/your/lambda-folder Runtime: nodejs18.x # 其他函数配置(比如Handler、Role等) Metadata: BuildMethod: esbuild # 用esbuild的话更高效 BuildProperties: NpmArgs: ['install', '--production']
如果你的项目还在使用传统的SAM构建方式(不是esbuild),可以改用Makefile来控制构建流程:
先在template.yaml里指定BuildMethod为makefile:
Metadata: BuildMethod: makefile
然后在对应Lambda函数的文件夹下创建Makefile,内容如下:
build-YourLambdaFunction: npm install --production cp -r . $(ARTIFACTS_DIR)
把YourLambdaFunction替换成你实际的函数名称即可。
2. 全局配置所有函数的构建行为
如果所有Lambda函数都需要忽略devDependencies,直接在项目根目录创建samconfig.toml文件,添加全局构建参数:
[default.build.parameters] npm_args = "--production"
这样每次运行sam build时,都会默认执行npm install --production,不用再逐个函数配置。
3. 用esbuild自动过滤(推荐)
如果你的SAM CLI是较新版本,默认已经支持esbuild作为构建工具。esbuild本身会自动识别并忽略devDependencies,而且还能做代码压缩、tree-shaking,打包速度和体积都更优。只要在template.yaml里把BuildMethod设为esbuild,不用额外配置npm参数就能自动跳过devDependencies:
Metadata: BuildMethod: esbuild
额外提醒
- 先确认你的SAM CLI是最新版本,旧版本可能不支持部分配置项,运行
sam --version检查,不够新就用pip install --upgrade aws-sam-cli升级。 - 既然用Layers管理依赖,记得在Lambda函数的配置里正确关联对应的Layer,避免运行时出现依赖缺失的问题。
内容的提问来源于stack exchange,提问作者Shah

