无服务器 YML toUpperCase
Serverless YML toUpperCase
我想在不同的环境(开发、测试、生产)中重用我的 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}}
您可以使用提供的 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
的属性并将任何自定义助手应用到这些值。
我想在不同的环境(开发、测试、生产)中重用我的 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}}
您可以使用提供的 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
的属性并将任何自定义助手应用到这些值。