[英]js-yaml issue with tags
我目前正在嘗試編輯 yaml 文件中的 2 條消息,但 js-yaml 似乎不明白如何處理我認為第一行的標簽:
--- !Status
Default:
Description:
- |-
Message1
Message2
Samples:
Multiple: false
DynamicPlayers: false
Unknown:
PlayerName: player
PlayerCount: '???'
Favicon:
Timeout: 10s
RecursiveFolderSearch: false
ResizeStrategy: SCALE
當我安全加載文檔時,我得到: YAMLException: unknown tag !<!Status> at line 17, column 1:
有什么辦法可以讓它忽略該標簽,還是有其他方法可以解決這個問題? 我無法刪除標簽,因為這會阻止程序讀取配置文件。
查看 js-yaml 存儲庫中的examples/custom_types.js
。 解決方案是創建一個新的jsyaml.Type
,它告訴 js-yaml 將!Status
值視為映射,如下所示:
let StatusYamlType = new jsyaml.Type('!Status', { kind: 'mapping' });
然后您需要創建一個包含StatusYamlType
類型的新架構:
let STATUS_SCHEMA = jsyaml.Schema.create([ StatusYamlType ]);
最后,通過schema
選項將新的STATUS_SCHEMA
傳遞給jsyaml.safeLoad
:
jsyaml.safeLoad(doc, { schema: STATUS_SCHEMA });
不幸的是,似乎沒有辦法讓 js-yaml 忽略所有標簽,因此如果您遇到其他標簽,您也必須為它們定義類型。
如果您還想使用!Status
標記編寫YAML 文件,那么您必須實際定義一個 Status 原型,並像示例中那樣為jsyaml.Type
構造函數提供construct
和instanceOf
選項。 一個非常基本的實現如下所示:
function Status(data) {
Object.assign(this, data);
}
let StatusYamlType = new jsyaml.Type('!Status', {
kind: 'mapping',
instanceOf: Status,
construct: data => new Status(data),
});
然后你通過架構jsyaml.safeDump
就像你對safeLoad
:
jsyaml.safeDump(result, { schema: STATUS_SCHEMA })
看看下面的代碼片段,看看它的作用。
let doc = `--- !Status Default: Description: - |- Message1 Message2 # ... `; function Status(data) { Object.assign(this, data); } let StatusYamlType = new jsyaml.Type('!Status', { kind: 'mapping', instanceOf: Status, construct: data => new Status(data), }); let STATUS_SCHEMA = jsyaml.Schema.create([ StatusYamlType ]); let result = jsyaml.safeLoad(doc, { schema: STATUS_SCHEMA }); console.log(result.constructor.name, result); console.log(jsyaml.safeDump(result, { schema: STATUS_SCHEMA }));
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/3.7.0/js-yaml.min.js"></script>
如您所見, safeDump
輸出使用的標記語法與您的原始輸入( !<!Status>
而不是--- !Status
)略有不同,但在這種情況下,它們是等效的,YAML 解析器應如此對待它們。
在 Visual Studio Code 中編輯 AWS Cloud Formation 模板時,我遇到了同樣的問題。
我發現在用戶設置中,如果我將以下代碼行添加到我的 user-settings.json 中,它允許標簽。
"yaml.customTags": [
"!Equals sequence",
"!FindInMap sequence",
"!GetAtt",
"!GetAZs",
"!ImportValue",
"!Join sequence",
"!Ref",
"!Select sequence",
"!Split sequence",
"!Sub"
]
你的將遵循相同的結構。 "!Status sequence"
這會告訴 YAML 配置准確地期望什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.