rails 错误,无法解析 YAML

Posted

技术标签:

【中文标题】rails 错误,无法解析 YAML【英文标题】:rails error, couldn't parse YAML 【发布时间】:2011-06-26 05:41:21 【问题描述】:

更新宝石后,我得到了这个:

/home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:148:in `parse': couldn't parse YAML at line 182 column 9 (Psych::SyntaxError)
    from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:148:in `parse_stream'
    from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:119:in `parse'
    from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:106:in `load'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:6:in `<module:LATEX>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:3:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `each'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `block in require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `each'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler.rb:120:in `require'
    from /home/megas/Work/railscasts/config/application.rb:10:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:28:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:28:in `block in <top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:27:in `tap'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:27:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

ruby-1.9.2-p136 轨道 3.0.3

尝试重新安装gem RedCloth,没有帮助,系统只想使用4.2.3版本

知道如何解决吗?谢谢

【问题讨论】:

有问题的 YAML 文件的内容是什么?它说存在语法错误,因此问题可能出在您的 YAML 文件中。 我不使用任何 YAML 文件,所以我认为这是其他人的问题。 您正在运行哪个命令?你在使用 RVM 吗? 它发生在命令 rails console 和 rails server 之后。是的,我正在使用 rvm 看到这个提交github.com/rails/rails/commit/dc94d81 【参考方案1】:

如果您像我一样面对一个包含数百个固定装置的项目(继承),那么几行 Ruby 代码可以为您节省时间:

require 'yaml'

d = Dir.new('test/fixtures/')
d.each do |file|
  begin
     f =  YAML.load_file('test/fixtures/' + file)
  rescue StandardError
     puts "failed to read test/fixtures/#file: #$!"
   end
 end

只需将它放在 Rails 根目录中并运行它,完成后将其丢弃。

【讨论】:

【参考方案2】:

对 Paul Raupach 的回答稍作调整,当从目录运行时,会在所有子目录中递归查找所有 *.yml 文件并测试该文件。我从我的 Rails 根目录运行它。

require 'yaml'

d = Dir["./**/*.yml"]
d.each do |file|
  begin
    puts "checking : #file"
    f =  YAML.load_file(file)
  rescue StandardError
    puts "failed to read #file: #$!"
  end
end

【讨论】:

【参考方案3】:

其中一个可能的原因是 在此上下文中不允许在第 ... 行映射值

这是一个不正确的 YAML 示例(用户:实际上不应包含任何值,因为它包含子项 some_key 和 some_other_key)

customer: Customer
user: User
  some_key: value
  some_other_key: value 2

找到此类问题并非易事,尤其是在您有一个巨大的 YAML 文件的情况下。

我创建了一个非常简单的正则表达式来检测这些事情。 我在 RubyMine 中检查了它

^(\s+)['"\w]+:\s?['"\w]+.*\n\1\s\s

小心!它不适用于特殊字符,如 å ø æ 等。

如果它对你有用,请在 cmets 中告诉我 :)

【讨论】:

【参考方案4】:

对于查看此问题的其他人,我在 rerun.txt 中发现了问题,该问题在 Rails 应用程序中由 config/cucumber.yml 调用。 rerun.txt 被配置为存储最近的黄瓜失败测试,​​我不知何故在控制台中为黄瓜测试输入了奇怪的字符。

这很难找到。希望我不久前看到Glenn Rempe's answer。

【讨论】:

【参考方案5】:

我设法通过在组 :development 和 :test 中安装 gem psych 来解决这个问题。

gem 'psych'

【讨论】:

【参考方案6】:

就我而言,这不是 Bundle 问题:(假定为 Ruby 1.9)

默认情况下,如果存在 libyaml,Ruby 使用“psych”(更新且维护的 yaml 库链接到 C 库:libyaml) 否则,Ruby 使用“syck”(旧且未维护) YAML::ENGINE.yamler= 'syck' 将强制 Ruby 在同时安装了 'psych' 的机器上使用 'syck'

更多信息在这里:require "yaml" doesn't use psych as default

【讨论】:

谢谢。我的也是 redmine 问题。【参考方案7】:

我遇到了一个非常非常奇怪的问题,因为后面有空格。例如:

title: "NASA"

没用,但是

title:"NASA"

做过。

【讨论】:

【参考方案8】:

Pshych 解析很烂。我不确定这是否是优雅的解决方案,但我设法通过卸载它来解决这个问题。

gem uninstall psych

【讨论】:

这给了我以下错误:gem "psych" cannot be uninstalled because it is a default gem【参考方案9】:

database.rb 中删除未使用的数据库。 如果您使用 mysql 并且没有 PostgreSQL,则从 databases.yml 删除 PG 数据库代码。

【讨论】:

【参考方案10】:

我在我正在构建的Sinatra 应用程序中使用r18n library 时遇到了这个问题,在我的翻译文件中我有以下内容:

day: !!pl
  0: 0 days
  1: 1 day
  n: %1 days

过去在 Ruby 1.8.7 下的旧项目中运行良好,但在 Ruby 1.9.3 下失败。

@SB 的回答给了我解决问题所需的线索。较新的 YAML 对 %1 犹豫不决。一些快速挖掘和irb 的实验,我现在知道YAML 解析器的较新版本要求您在以%1 开头的字符串周围加上引号,所以我只是将我的翻译更改为

day: !!pl
  0: 0 days
  1: 1 day
  n: "%1 days"

瞧——讨厌的错误信息消失了。

【讨论】:

【参考方案11】:

好吧,以防万一这有帮助... 我做了什么: - 全选并从 https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml 复制到带有记事本++的新 es.yml - 尝试使用 netBeans IDE 文本编辑器观看这个新文件,我收到一个关于使用 utf8 安全加载的警告(无法回忆确切的文本)。因此没有用这个文本编辑器打开它。 - 通过配置/application.rb i18n 切换本地 - 当我加载一个 irb 页面时,我得到“无法在第 0 行第 0 列解析 YAML”,指的是 Psych。 - 去 IRB 并用 syck 加载文件没问题;切换到 psych 并得到同样的错误。

我是如何解决的: - 回去复制 https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml 的内容,但这次我用 netBeans 编辑器将它粘贴到一个新创建的文件中。 - 重新启动 webRick。 - 问题解决了。 最好的问候, 维克多

【讨论】:

【参考方案12】:

我遇到了这个问题。我的问题是我的 database.yml 文件中有一个额外的选项卡。

【讨论】:

我忘记在密码:和“我的密码”之间添加标签【参考方案13】:

就我而言,有 2 个问题。

    正如@stwienert 所述,数组表示是一个问题。 还有一件事是,如果字符串以 %var 开头,我会收到 Parse 异常。我必须相应地更改字符串以避免以 %var 开头

例如,如果字符串是

%user_name welcome to %application_name -- 这引发了错误

要修复它,我必须将其更改为

Hi, %user_name welcome to %application_name

希望这对某人有所帮助。

问候,

沙杜尔。

【讨论】:

您可以简单地更改YAML 文件以在字符串周围加上引号,因此hello: %user_name welcome to %application_name 变为hello: "%user_name welcome to %application_name" 而不必更改您的句子,即马车领先。 【参考方案14】:

我在尝试使用密码 'p@ssword' 连接到远程数据库时遇到此错误,并发现 psych 不喜欢 '@' 符号。更改数据库密码,问题解决。

【讨论】:

【参考方案15】:

我遇到了与格式错误的 YAML 翻译文件类似的问题。它在定义它之前使用了一个变量。以下是错误的:

...
messages:
  ...
  <<: *errors_messages
...
messages: &errors_messages
...

必须改成:

...
messages: &errors_messages
...
messages:
  ...
  <<: *errors_messages
...

然后它又开始工作了。

【讨论】:

【参考方案16】:

对于阅读本文的其他人,我在数据库配置中输入错误后收到此错误 - /config/database.yml

【讨论】:

错字包括不在文件末尾添加换行符,显然......!【参考方案17】:

最好修复您的 YAML 文件

这是使用 irb 的方法,因此您不需要可能无法正常工作的 rails 控制台:

require 'yaml'
YAML::ENGINE.yamler = 'psych'
YAML.load_file('config/locales/xxx.en.yml')

你会得到一个很好的输出,告诉你问题出在哪里:

Psych::SyntaxError: couldn't parse YAML at line 25 column 17
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in `parse'
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in `parse_stream'
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:119:in `parse'
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:106:in `load'
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:205:in `load_file'
    from (irb):10
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'

【讨论】:

【参考方案18】:

对于那些追求这个问题的人,我刚刚发现我的 database.yml 触发了这个错误,因为它在密码:关键字和密码之间没有空格。一个几乎不可见的错误,并且 database.yml 在早期版本的 rails 上运行时没有错误。

【讨论】:

【参考方案19】:

我遇到了这个问题,因为我使用的是制表符而不是空格

【讨论】:

是的,感觉我们应该结束了! 在盯着 yml 文件搜索丢失的冒号后失明。【参考方案20】:

需要检查 .yml 文件是否有错误,我在 database.yml 中发现了问题

【讨论】:

【参考方案21】:

您在某处有无效的 YAML 代码。我的意思是对 Psych(新的 ruby​​ YAML 解析器)无效。

如果您不能(或不想)修复您的 YAML 代码,请尝试加载旧的 YAML 解析器 (syck),将其添加到 config/boot.rb 的开头

require 'yaml'
YAML::ENGINE.yamler = 'syck'

我知道,这只是一个“快速而肮脏”的修复方法

【讨论】:

Bundler 1.0.10 默认将 Psych 作为 YAML 引擎加载。 Psych 不适用于 rails(我使用的是 rails 3.0.4,而 v3.0.3 也有同样的问题)。见here。解决方案:显式设置另一个 YAML 引擎 这解决了我的 YAML 文件没有正确加载锚引用的问题。 这只是一个快速的解决方案,而不是一个长期的解决方案。可能您的某些 yaml 文件中存在语法错误,您应该修复这些错误。 我遇到了类似的问题,因此通过yamllint.com 运行我的 YAML 以查看是否有问题。尽管它报告 YAML 是有效的,但它重新格式化了文件。我用这个重新格式化的版本替换了旧的非工作 YAML,它工作了。问题解决了。 对于所有的反对者来说,是的,修复你的 YAML,但是这个提示是无价的,因为如果你有坏的 YAML 用 syck 序列化,并且你想将它转换为有效的YAML 用 psych 序列化,您需要能够在同一个 ruby​​ 执行期间使用这两个解析器。【参考方案22】:

虽然@Vicvega 给出的答案可能有效,也可能无效(没有测试过),但它违反了 Rails 和 Ruby 的共同原则 “约定优于配置”,应该谨慎对待(并且在协作工作中更多),,,即使这种情况下的“配置”不是很好

所以我投票给那些提议消除 YAML 文件中的语法错误的人(如果我可以投票的话)。

现在...要解决这个错误,对我来说这是一个新错误,我没有我在 Config/application.rb 中定义为默认的语言环境文件在我的 Config/locales 目录中

快乐编码

【讨论】:

【参考方案23】:

我对 ruby​​ 1.9.2-p180 有同样的问题,去 1.9.2-p290 为我解决了这个问题

【讨论】:

【参考方案24】:

原始问题的问题在于 RedCloth。我遇到了同样的问题,只需更新到 RedCloth gem 的最新版本(当前为 4.2.7)即可解决此问题。

来自 Honza 和 FlyboyArt 的上述建议是合理的,您应该修复您拥有的任何自定义 YAML,但是随着 RedCloth 的流行,大多数发现这个问题的用户也使用 RedCloth 应该确保他们的 GemFile 添加了这一行:

gem 'RedCloth', ">= 4.2.7"

【讨论】:

【参考方案25】:

根本原因在很多地方都有描述,我再总结一下。

有两个默认的 yaml 解析器 Psych 是新的,你应该使用的那个。 Syck 是旧的,它没有维护和死亡,它目前用作没有 libyaml 存在时的后备(通常是非 linux 系统)。

重要的是你在某处有一些无效的 yaml。它很可能在您的翻译文件中(我有未加引号的字符串,带有 %)。只需尝试在生产盒上使用 YAML.load_file 加载所有 yml 文件,您就会看到哪个是损坏的。

【讨论】:

投反对票,因为你错了。 psych 不支持默认块,这在技术上更接近 yaml 标准,但打破了(除其他外)rails 的现有和预期使用。 IMO ruby​​ 应该使用既维护又支持现有用法的解析器,即使该用法与规范相差甚远。要是有这样的事就好了。在此之前,他们应该使用 syck。 我也同意莎拉的观点。对 pysch 的整个迁移只是令人头疼,没有明显的价值。我的“无效 yaml”并非无效,它只是使用“订单:[:年,:月,:日]”语法,据我所知(或关心),这一直很好 显然 1.3 版的 psych 理解默认值。也许 :-) 解决方案:在 Gemfile 中使用“gem 'psych', '>=1.3.2'”。【参考方案26】:

绝对修复您的 yaml 代码,而不仅仅是通过强制 YAMl 使用“syck”来“掩盖”真正的问题。我遇到了同样的问题,并在我的本地化文件中发现了格式错误的 yml 语句。如果您只是强制使用旧的解析器,那么您将无法从项目其他地方的新解析器上获得所有工作的好处。

【讨论】:

我无法使用新的解析器检测到任何好处,只有神秘的错误消息(我目前正在查看没有第 16 列的文件的“第 1 行上的错误未知,第 16 列”在第 1 行中)在用先前版本的 psych 解析的明显正确的 YAML 文件中。无休止的错误修复和回归是一天的顺序。所以不要自高自大,这是一个无休止的头痛。【参考方案27】:

这是一个捆绑器 1.0.10 问题:details here

尝试仅更新捆绑程序

【讨论】:

我用的是1.0.10,你的意思是等待新版本? 我解决了回到 bundler 1.0.7 的问题。希望下个版本能解决这个问题 我正在使用 Bundler 1.1.3 版,它仍然可以使用。【参考方案28】:

我的常规 Rails 3 应用也有这个问题,因为我使用的是本地化的 yaml 文件作为日期/时间。

正如您在此提交中看到的 https://github.com/rails/rails/commit/dc94d81 这可以通过将数组放在单独的行中轻松“修复”。

         -    order: [ :year, :month, :day ]
    18  +    order:
    19  +      - :year
    20  +      - :month
    21  +      - :day

【讨论】:

谢谢,正在寻找这个问题并解决了它,尽管这与上面问题的问题不同:) 我在使用 Rubber-postgresql.yml 时遇到了问题,通过编辑器修复了这样的引用,它成功了。其余的橡胶配置似乎很好。【参考方案29】:

在我的原因中修复它的确实是格式错误的 YAML 翻译文件:

config/locales/bg.yml

更正了 YAML 错误,一切都很好。 :-)

【讨论】:

没有帮助,可能是我在另一个 YAML 文件中的错误,如何找出错误的 YAML 文件在哪里?

以上是关于rails 错误,无法解析 YAML的主要内容,如果未能解决你的问题,请参考以下文章

Rails webpack 错误:第 3 方 gem 无法解析 jQuery

无法解析类org.yaml.snakeyaml.Yaml @Grab('org.yaml:snakeyaml:1.17')Jenkins管道

找到 YAML 文件,但无法解析内容

Golang使用yaml第三方包无法正确解析配置参数

使用 SnakeYaml 解析时忽略来自 yaml 的字段(无法在类上找到属性)

k8s中pod内dns无法解析的问题