首页 > 解决方案 > 如何从 serverless.yml 中的多个 yml 文件中加入或合并 provider.patterns 数组,以及如何在预定事件上设置启用标志

问题描述

我有 serverless_common.yml 文件,用于所有 lambdas 中的所有共享内容,当我尝试导入package.patterns个人服务 yml 文件时,我的个人服务中有 serverless.yml 执行时出现以下错误sls print

Serverless Error ----------------------------------------
 
  Configuration error: 
       at 'functions.app.events[0]': unrecognized property 'enabled'
       at 'package.patterns[0]': should be string

Your Environment Information ---------------------------
     Operating System:          darwin
     Node Version:              14.16.1
     Framework Version:         2.46.0 (local)
     Plugin Version:            5.4.0
     SDK Version:               4.2.3
     Components Version:        3.12.0
#serverless_common.yml
package:
  patterns:
  - '!target/**'
  - '!tests/**'
  - '!test/**'
  - '!tools/**'
  - '!README.md'
  - '!node_modules/.bin/**'
  - '!serverless/**'
  - '!.*'
#service1/serverless.yml
package:
  individually: true
  patterns: 
    - something-specific-to-service1
    - ${file(../serverless_common.yml):package.patterns}
functions:
  app:
    handler: index.handler
    name: service1
    events:
      - schedule: cron(0 09 * * ? *)
        enabled: false
serverless_common.yml        
/service1
  |- package.json     
  |- index.js
  |- serverless.yml   
/service2
  |- package.json    
  |- index.js
  |- serverless.yml   

标签: amazon-web-servicesyamlserverless-framework

解决方案


这些错误警告您有两个缩进问题。第一个在您的serverless_common.yml文件中。数组项应进一步缩进一位:

#serverless_common.yml
package:
  patterns:
    - '!target/**'
    - '!tests/**'
    - '!test/**'
    - '!tools/**'
    - '!README.md'
    - '!node_modules/.bin/**'
    - '!serverless/**'
    - '!.*'

第二个是在你的 cron 表达式中。单行语法仅适用于不使用其他参数的情况。既然你想通过enabled: false,你需要使用多行语法:

#service1/serverless.yml
functions:
  app:
    handler: index.handler
    name: service1
    events:
      - schedule:
          rate: cron(0 09 * * ? *)
          enabled: false

不幸的是,您选择的语法不会合并这两个数组。您必须单独引用数组中的每个项目,或者将您的项目重写serverless.yml到一个serverless.js文件中,这样您就可以更加程序化。

package:
  individually: true
  patterns: 
    - something-specific-to-service1
    - ${file(../serverless_common.yml):package.patterns.foo}
    - ${file(../serverless_common.yml):package.patterns.bar}
    # ... etc

推荐阅读