如何在Serverless模板中合并自定义custom配置与预设值?
Serverless Framework 主模板合并 Custom 配置的解决方案
问题根源
你遇到的解析错误,大概率是YAML锚点的合并语法写法有误——要么是锚点定义时缩进、冒号不规范,要么是合并时<<: *anchor的位置不正确,导致YAML解析器无法识别。
正确实现方式
1. 主模板定义基础配置锚点
在你的主模板文件(比如serverless.base.yml)里,把serverless-python-requirements的必填配置封装成一个锚点:
# serverless.base.yml custom: &baseCustomConfig serverless-python-requirements: dockerizePip: true # 这里放所有全局强制的插件配置,比如缓存、层设置等
2. 子文件合并基础配置与自定义内容
在用户的子serverless.yml里,用YAML的字典合并语法,先引入锚点,再追加自定义的custom内容。这样用户的自定义配置会自动和基础配置合并,同名键还会覆盖基础值:
# serverless.yml service: user-specific-service # 继承主模板 extends: file: serverless.base.yml # 合并基础配置与自定义内容 custom: <<: *baseCustomConfig # 下面是用户自己的自定义配置 appEnv: production apiRateLimit: enabled: true maxRequests: 1000
3. 避坑注意事项
- 锚点定义时,
&baseCustomConfig必须紧跟在custom:后面,后续字典内容的缩进要严格符合YAML规范,不能遗漏冒号。 - 合并时
<<: *baseCustomConfig是custom字典的一个键值对,缩进要和下方的自定义配置保持一致,不能错位。 - 如果用户需要给
serverless-python-requirements追加额外配置,直接在子文件的custom里重写该键,嵌套使用合并语法即可:
custom: <<: *baseCustomConfig serverless-python-requirements: <<: *baseCustomConfig.serverless-python-requirements zip: true # 追加的自定义插件配置
备选方案:用Serverless变量替代锚点
如果YAML锚点还是有问题,直接用Serverless的文件变量引用+字典合并也能实现需求:
# serverless.base.yml custom: basePythonRequirements: dockerizePip: true # 全局配置
# serverless.yml custom: serverless-python-requirements: <<: ${file(serverless.base.yml):custom.basePythonRequirements} additionalSetting: value # 其他自定义配置
内容的提问来源于stack exchange,提问作者Antoine Delia
相关产品推荐
相关产品推荐

