无服务器 YML toUpperCase

Serverless YML toUpperCase

我想在不同的环境(开发、测试、生产)中重用我的 serverless.yml

在我的配置中:

provider:
  name: aws
  stage: ${opt:stage, 'dev'}
  environment:
    NODE_ENV: ${self:provider.stage}

现在该值为 devtestprod(均为小写)。

有没有办法将其转换为 UpperCase(),使输入和 self:provider:stage保持 原样(即小写),但NODE_ENV 的值将是大写?

据我所知,YAML 中没有这样的功能。

您可以通过使用小写和大写名称之间的映射来实现您想要的。

custom:
  environments:
    dev: DEV
    test: TEST
    prod: PROD

provider:
  name: aws
  stage: ${opt:stage, 'dev'}
  environment:
    NODE_ENV: ${self:custom.environments.${self:provider.stage}}

您可以使用提供的 reference variables in javascript files 功能实现此效果。

以您的示例为例,这应该可行(假设您 运行 在支持现代语法的 node.js 环境中)

serverless.yml

...
provider:
  name: aws
  stage: ${opt:stage, 'dev'}
  environment:
    NODE_ENV: ${file(./yml-helpers.js):provider.stage.uppercase}
...

yml-helpers.js(与serverless.yml相邻)

module.exports.provider = serverless => {
  // The `serverless` argument containers all the information in the .yml file
  const provider = serverless.service.provider;

  return Object.entries(provider).reduce(
    (accumulator, [key, value]) => ({
      ...accumulator,
      [key]:
        typeof value === 'string'
          ? {
              lowercase: value.toLowerCase(),
              uppercase: value.toUpperCase()
            }
          : value
    }),
    {}
  )
};

我通过阅读一些源代码和控制台记录整个 serverless 对象,得出了一些可行的方法。此示例将辅助函数应用于一些输入选项值的首字母大写(根据需要应用 str.toUpperCase())。解析无服务器对象中已有的输入选项的结果。

// serverless-helpers.js

function toTitleCase(word) {
  console.log("input word:  " + word);
  let lower = word.toLowerCase();
  let title = lower.replace(lower[0], lower[0].toUpperCase());
  console.log("output word: " + title);
  return title;
}

module.exports.dynamic = function(serverless) {
  // The `serverless` argument contains all the information in
  // the serverless.yaml file
  // serverless.cli.consoleLog('Use Serverless config and methods as well!');

  // this is useful for discovery of what is available:
  // serverless.cli.consoleLog(serverless);

  const input_options = serverless.processedInput.options;
  return {
    part1Title: toTitleCase(input_options.part1),
    part2Title: toTitleCase(input_options.part2)
  };
};
# serverless.yaml snippet

custom:

  part1: ${opt:part1}
  part2: ${opt:part2}

  dynamicOpts: ${file(./serverless-helpers.js):dynamic}
  combined: prefix${self:custom.dynamicOpts.part1Title}${self:custom.dynamicOpts.part2Title}Suffix

这个简单的例子假设输入选项是 --part1={value}--part2={value},但一般来说是遍历 serverless.processedInput.options 的属性并将任何自定义助手应用到这些值。