如何从命令行验证我的 YAML 文件?

Posted

技术标签:

【中文标题】如何从命令行验证我的 YAML 文件?【英文标题】:How do I validate my YAML file from command line? 【发布时间】:2011-04-27 16:11:40 【问题描述】:

我在提取 YAML 配置文件时遇到问题:

致命错误:解析块映射时;预期 ,但找到了 block entry

虽然有很多在线 YAML 验证器,我已经尝试过并提供了帮助,但我想从命令行验证我的 YAML 文件并将其集成到我的持续集成管道中。

如何在命令行上验证 YAML 文件的语法?

【问题讨论】:

试试:travis lint .travis.yml python -c "from yaml import load, Loader; load(open('.travis.yml'), Loader=Loader)" 这个问题不应该被关闭。也许将其重新命名为“如何从命令行验证我的 YAML 文件”。这是一个有效且有用的问题 Seconded @hanxue - 这是搜索主题时的第一个结果,当谷歌将我们带到这里时应该是一个有用的参考。 是的,这个问题不应该被关闭。我不认为答案是固执己见或垃圾邮件。 【参考方案1】:

通过基本的 Ruby 安装,这应该可以工作:

ruby -ryaml -e "p YAML.load(STDIN.read)" < data.yaml

Python 版本(感谢 @Murphy):

pip install pyyaml
python -c 'import yaml, sys; print(yaml.safe_load(sys.stdin))' < data.yaml

【讨论】:

如果你从结尾删除puts y,那么你会得到一个更标准的 UNIX 行为:如果文件是有效的,那么什么都不会被打印,如果它是无效的,那么你会看到一个异常和堆栈跟踪。 如果您真的只是将它用作 ci 测试管道的一部分,那么根本不需要 puts。如果有效,返回码就是0,否则非零,你会得到一个异常堆栈跟踪。即使您正在查看它,也可以减少 CLI 输出上的噪音。 如果您使用以下内容:ruby -e "require 'yaml';puts YAML.load_file(ARGV[0])" 然后您可以在之后传递文件名,而无需直接编辑 sn-p。 python -c 'import yaml, sys; yaml.safe_load(sys.stdin)' &lt; data.yaml python 爱好者.. python3 -c 'import yaml, sys, pprint; pprint.pprint(yaml.safe_load(sys.stdin))' &lt; data.yaml 漂亮的版画【参考方案2】:

您可以使用yamllint。它在 Homebrew 等中可用。它可用于语法验证以及 linting。

【讨论】:

【参考方案3】:

鉴于您在正在使用的服务器上安装了 perl,并且它具有一些基本的 YAML 工具,您可以使用...

perl -MYAML -e 'use YAML;YAML::LoadFile("./file.yaml")'

需要注意的是,这对文件的解释会很严格,但是很有用。

【讨论】:

找不到 YAML.pm /usr/bin/perl -MCPAN -e '安装 YAML' 可能是 CPAN 安装的问题,但是:Can't locate object method "install" via package "YAML" at -e line 1. 如果上述方法不起作用,您可以随时尝试:perl -MCPAN -e 'shell',然后在命令行执行install YAML【参考方案4】:

要更正您的 .yaml 文件,我推荐使用 yamllint 工具。它可以从本地控制台轻松启动。

yamllint 适用于所有主要操作系统。

它可以从系统的包源安装。 (例如sudo apt-get install yamllint)。 See documentation for quick start and installation.

【讨论】:

yamllint 默认情况下会调用很多实际上完全可以接受的“错误”。例如行太长,或“错误”的缩进。我确信修复这些问题是可定制的,但对于许多常见用例来说太挑剔了。【参考方案5】:

如果您的环境中没有安装解释器但仍然有 curl,那么您可以使用在线 linter 项目,例如 Lint-Trilogy:

curl -X POST  --data "data=$(cat myfile.yml)" https://www.lint-trilogy.com/lint/yaml/json

它提供验证结果,包括。错误描述(如果有)为 json 或 csv,或者在足够的情况下,作为纯文本 truefalse

它也可以作为 docker 文件使用。因此,如果您经常需要基于 REST 的 linter,可能在 CI/CD 管道中,那么在您的站点上托管自己的实例可能会很方便。

【讨论】:

将您的 yaml 导出给第三方需要对该第三方非常信任 没错,这就是为什么 linter 是开源的并且可以作为 docker 容器在您自己的笔记本上运行的原因。 Github 仓库:github.com/berndkuennen/lint_trilogy 它对我有用。这是如何在 netplan 配置中处理空格和制表符的简单方法【参考方案6】:

或者交替安装(免费)Eclipse IDE 和 YEdit yaml 编辑器,查看带有语法突出显示、错误标志和大纲视图的 yaml。一次性设置成本对我来说非常有效。

【讨论】:

OP 专门要求提供 CLI 解决方案。

以上是关于如何从命令行验证我的 YAML 文件?的主要内容,如果未能解决你的问题,请参考以下文章

AppEngine文档建议使用命令行标志而不是app.yaml文件元素

如何在没有 CMake 的情况下构建 yaml-cpp

SpringBoot 中属性文件、YAML 文件和命令行参数之间的优先顺序

如何从 bash 验证是不是已安装 xcode 命令行工具?

使用带反斜杠的sed命令时出现AWS CloudFormation模板验证错误

如何从文件传递命令行参数