Yaml 无服务器YML toUpperCase

Yaml 无服务器YML toUpperCase,yaml,serverless,Yaml,Serverless,我想在不同的环境(开发、测试、产品)中重用我的serverless.yml 在配置中,我有: provider: name: aws stage: ${opt:stage, 'dev'} environment: NODE_ENV: ${self:provider.stage} 现在,该值将是dev、test或prod(全部小写) 有没有一种方法可以将其转换为UpperCase(),使输入和self:provider:stage保持原样(即小写),但NODE_ENV的值是大

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

在配置中,我有:

provider:
  name: aws
  stage: ${opt:stage, 'dev'}
  environment:
    NODE_ENV: ${self:provider.stage}
现在,该值将是
dev
test
prod
(全部小写)


有没有一种方法可以将其转换为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}}

您可以使用提供的功能来实现这种效果

以您的示例为例,这应该是可行的(假设您在支持现代语法的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=>{
//'serverless'参数包含.yml文件中的所有信息
const provider=serverless.service.provider;
返回Object.entries(提供程序).reduce(
(累加器,[键,值]=>({
…蓄电池,
[钥匙]:
值的类型==='string'
? {
小写:value.toLowerCase(),
大写:value.toUpperCase()
}
:价值
}),
{}
)
};

通过阅读一些源代码和控制台记录整个
serverless
对象,我找到了一些可行的方法。本例将一个帮助函数应用于一些输入选项值(根据需要,改为应用
str.toUpperCase()
)。解析serverless对象中已有的输入选项会产生一个结果

//serverless-helpers.js
函数toTitleCase(word){
console.log(“输入字:“+word”);
let lower=word.toLowerCase();
让title=lower.replace(lower[0],lower[0].toUpperCase());
控制台日志(“输出字:”+标题);
返回标题;
}
module.exports.dynamic=函数(无服务器){
//`serverless`参数包含中的所有信息
//serverless.yaml文件
//consoleLog('同时使用无服务器配置和方法!');
//这对于发现可用内容非常有用:
//serverless.cli.consoleLog(serverless);
const input_options=serverless.processedInput.options;
返回{
第1部分标题:toTitleCase(输入选项第1部分),
第2部分标题:toTitleCase(输入选项第2部分)
};
};
#serverless.yaml代码段
自定义:
第1部分:${opt:part1}
第2部分:${opt:part2}
dynamicOpts:${file(./serverless helpers.js):dynamic}
组合:前缀${self:custom.dynamicOpts.part1Title}${self:custom.dynamicOpts.part2Title}后缀

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

我认为这是一种潜在的解决方法,并使用了类似的技术。我想知道有没有更好或合适的方法。无论如何,如果没有什么,我可以用地图。谢谢尽管指定了--stage=foo,但它始终返回DEV。我正在使用serverless@1.71.0