【发布时间】:2018-12-01 01:38:11
【问题描述】:
我正在尝试设置 JSON 配置文件的层次结构,其中可以在多个级别覆盖默认值。每个文件都是一组键/值对。其中有许多是按功能按非字母顺序组织的。
我找到了一种方法来获得我想要的逻辑结果,但是它是按字母顺序排序的,并且由于预期参数的数量,用户很难清楚/快速地查看集合是否是什么他们想要在使用它之前。
有没有办法执行这种合并,替换匹配键上的值并保留顺序?
我有这些文件:
default.json:
[
{ "ParameterKey": "FirstStackName", "ParameterValue": "Production-App-Database" },
{ "ParameterKey": "SecondStackName", "ParameterValue": "Production-Directory" },
{ "ParameterKey": "ThirdStackName", "ParameterValue": "Production-VPC" },
{ "ParameterKey": "FourthStackName", "ParameterValue": "AMIFunctions" },
{ "ParameterKey": "FifthKeyName", "ParameterValue": "administrator" },
{ "ParameterKey": "SixthUserName", "ParameterValue": "admin" },
{ "ParameterKey": "SeventhPassword", "ParameterValue": "" }
]
环境.json:
[
{ "ParameterKey": "FirstStackName", "ParameterValue": "Development-App-Database" },
{ "ParameterKey": "SecondStackName", "ParameterValue": "Development-Directory" },
{ "ParameterKey": "ThirdStackName", "ParameterValue": "Development-VPC" },
{ "ParameterKey": "FifthKeyName", "ParameterValue": "developer" }
]
user.json:
[
{ "ParameterKey": "FifthKeyName", "ParameterValue": "jdoe" }
]
secure.json:
[
{ "ParameterKey": "SeventhPassword", "ParameterValue": "secretvalue" }
]
如果我运行这个:
jq -s '.[3] + .[2] + .[1] + .[0] | unique_by(.ParameterKey)' default.json environment.json user.json secure.json
我得到了一些有用的东西:
[
{
"ParameterKey": "FifthKeyName",
"ParameterValue": "jdoe"
},
{
"ParameterKey": "FirstStackName",
"ParameterValue": "Development-App-Database"
},
{
"ParameterKey": "FourthStackName",
"ParameterValue": "AMIFunctions"
},
{
"ParameterKey": "SecondStackName",
"ParameterValue": "Development-Directory"
},
{
"ParameterKey": "SeventhPassword",
"ParameterValue": "secretvalue"
},
{
"ParameterKey": "SixthUserName",
"ParameterValue": "admin"
},
{
"ParameterKey": "ThirdStackName",
"ParameterValue": "Development-VPC"
}
]
但是(想象一下 60 个参数)它不容易被扫描为正确的,而我想要的是:
[
{ "ParameterKey": "FirstStackName", "ParameterValue": "Development-App-Database" },
{ "ParameterKey": "SecondStackName", "ParameterValue": "Development-Directory" },
{ "ParameterKey": "ThirdStackName", "ParameterValue": "Development-VPC" },
{ "ParameterKey": "FourthStackName", "ParameterValue": "AMIFunctions" },
{ "ParameterKey": "FifthKeyName", "ParameterValue": "jdoe" },
{ "ParameterKey": "SixthUserName", "ParameterValue": "admin" },
{ "ParameterKey": "SeventhPassword", "ParameterValue": "secretvalue" }
]
【问题讨论】:
-
default.json是否保证拥有在其他文件中找到的键的超集? -
可以做到。不确定是否有替代方案。如果您没有猜到,这是将参数数组传递给 AWS CloudFormation 模板。那是在 YAML 中,并且具有完整的默认设置。因此,理想情况下,我只想传入环境、用户和安全覆盖,因为默认值在模板本身中。但是,不要认为这很容易做到。
-
我没有猜到——我构建了一个在物理硬件上发布的产品,并且没有任何使用 CloudFormation 的经验。也就是说,您所描述的内容对我来说似乎并不难,但我需要一个合适的复制器来测试问题中提供的内容是否不足以准确代表真实情况。