如何配置Serverless Framework使打包后index.js处于Zip包根目录?
解决方案
要实现将serverless/function-folder下的文件直接放到Zip包根目录,同时保留指定的主项目依赖,可通过以下两种方式配置:
方式一:使用package.basePath(无需额外插件)
修改serverless.yml,针对单个函数配置打包基础路径,调整后的完整配置如下:
service: 'service' plugins: - serverless-offline package: individually: true patterns: - '!./**' - 'node_modules/dependency1/**' - 'node_modules/dependency2/**' - 'node_modules/dependency3/**' provider: name: aws runtime: nodejs16.x functions: function_folder: handler: index.handler # 改为指向Zip根目录的index.js package: basePath: serverless/function_folder # 将该目录设为打包的基础路径 patterns: - './**' # 包含function-folder下的所有文件及子目录
配置说明
package.individually: true开启单函数独立打包,支持为每个函数单独配置打包规则- 函数级的
package.basePath指定serverless/function_folder后,Serverless会将该目录下的所有内容直接放到Zip包根目录,自然实现index.js、other_files的根目录放置 - 全局
package.patterns保留指定的主项目依赖,这些依赖会被打包到Zip包的node_modules目录下 - 函数
handler路径改为index.handler,匹配Zip根目录的index.js文件
方式二:使用serverless-plugin-copy插件(适配复杂场景)
如果需要更灵活的文件移动规则,可借助serverless-plugin-copy插件实现:
- 安装插件:
npm install serverless-plugin-copy --save-dev
- 修改
serverless.yml:
service: 'service' plugins: - serverless-offline - serverless-plugin-copy package: individually: true patterns: - '!./**' - 'node_modules/dependency1/**' - 'node_modules/dependency2/**' - 'node_modules/dependency3/**' - 'serverless/function_folder/**' # 先将原目录文件纳入打包范围 custom: copy: - source: serverless/function_folder/* target: ./ # 将function-folder下的文件复制到打包根目录 - source: serverless/function_folder/other_files target: ./other_files/ # 复制子目录到根目录对应位置 provider: name: aws runtime: nodejs16.x functions: function_folder: handler: index.handler # 指向Zip根目录的index.js
说明
- 插件会在打包流程中执行文件复制操作,精准调整Zip包内的目录结构
- 适合需要对多组文件/目录进行自定义移动的复杂场景
更优维护建议
如果后续要集成更多Lambda函数到主项目,建议调整目录结构,将所有函数统一放到src/functions目录下,每个函数单独占用一个子目录:
main-project-directory - node_modules - src - functions - function-folder - other_files/ - index.js - serverless.yml
结合方式一的basePath配置,能更清晰地管理每个函数的打包规则,降低长期维护成本。
内容的提问来源于stack exchange,提问作者basicBanana
相关产品推荐
相关产品推荐

