簡體   English   中英

帶有標簽的 js-yaml 問題

[英]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構造函數提供constructinstanceOf選項。 一個非常基本的實現如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM