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管道