GemCutter rake生成现在抛出“未定义的方法”写入#<Syck :: Emitter:…“更新到rubygems 1.5.0在ruby 1.9.2在Windows

我只是将Windows 2008 Server x64盒子更新为rubygems 1.5.0,现在我无法使用Gemcutter提供的rake任务( rake clobber build )来构buildgem。 我得到以下错误:

 rake aborted! undefined method `write' for #<Syck::Emitter:0x37dda38> C:/Ruby192/lib/ruby/1.9.1/psych/visitors/emitter.rb:17:in `end_document' C:/Ruby192/lib/ruby/1.9.1/psych/visitors/emitter.rb:17:in `visit_Psych_Nodes_Document' C:/Ruby192/lib/ruby/1.9.1/psych/visitors/visitor.rb:10:in `accept' C:/Ruby192/lib/ruby/1.9.1/psych/visitors/emitter.rb:10:in `block in visit_Psych_Nodes_Stream' C:/Ruby192/lib/ruby/1.9.1/psych/visitors/emitter.rb:10:in `each' C:/Ruby192/lib/ruby/1.9.1/psych/visitors/emitter.rb:10:in `visit_Psych_Nodes_Stream' C:/Ruby192/lib/ruby/1.9.1/psych/visitors/visitor.rb:11:in `accept' C:/Ruby192/lib/ruby/1.9.1/psych/nodes/node.rb:36:in `to_yaml' C:/Ruby192/lib/ruby/1.9.1/psych.rb:166:in `dump' C:/Ruby192/lib/ruby/1.9.1/psych/core_ext.rb:13:in `psych_to_yaml' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:706:in `node_export' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:706:in `add' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:706:in `encode_with' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:727:in `block (2 levels) in to_yaml' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:726:in `map' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:726:in `block in to_yaml' C:/Ruby192/lib/ruby/1.9.1/syck.rb:401:in `call' C:/Ruby192/lib/ruby/1.9.1/syck.rb:401:in `emit' C:/Ruby192/lib/ruby/1.9.1/syck.rb:401:in `quick_emit' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:725:in `to_yaml' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/builder.rb:78:in `block (2 levels) in write_package' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/package/tar_output.rb:73:in `block (3 levels) in add_gem_contents' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/package/tar_writer.rb:83:in `new' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/package/tar_output.rb:67:in `block (2 levels) in add_gem_contents' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/package/tar_output.rb:65:in `wrap' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/package/tar_output.rb:65:in `block in add_gem_contents' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/package/tar_writer.rb:113:in `add_file' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/package/tar_output.rb:63:in `add_gem_contents' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/package/tar_output.rb:31:in `open' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/package.rb:68:in `open' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/builder.rb:77:in `block in write_package' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/builder.rb:76:in `open' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/builder.rb:76:in `write_package' C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/builder.rb:39:in `build' C:/Ruby192/lib/ruby/gems/1.9.1/gems/jeweler-1.5.2/lib/jeweler/commands/build_gem.rb:16:in `run' C:/Ruby192/lib/ruby/gems/1.9.1/gems/jeweler-1.5.2/lib/jeweler.rb:87:in `build_gem' C:/Ruby192/lib/ruby/gems/1.9.1/gems/jeweler-1.5.2/lib/jeweler/tasks.rb:84:in `block in define' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:636:in `call' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:636:in `block in execute' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:631:in `each' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:631:in `execute' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:597:in `block in invoke_with_call_chain' C:/Ruby192/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:583:in `invoke' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2029:in `block (2 levels) in top_level' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2029:in `each' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2029:in `block in top_level' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2001:in `block in run' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:1998:in `run' C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/bin/rake:31:in `<top (required)>' C:/Ruby192/bin/rake:19:in `load' C:/Ruby192/bin/rake:19:in `<main>' 

基于使用包含以下内容的包:

 Using rake (0.8.7) Using bundler (1.0.10) Using diff-lcs (1.1.2) Using git (1.2.5) Using jeweler (1.5.1) Using json (1.5.1) Using rcov (0.9.9) Using rspec-core (2.1.0) Using rspec-expectations (2.1.0) Using rspec-mocks (2.1.0) Using rspec (2.1.0) Using syntax (1.0.0) Using systemu (1.2.0) Using win32console (1.3.0) 

以及安装到系统中的以下gem

 activemodel (3.0.3, 3.0.1) activerecord (3.0.3, 3.0.1) activerecord-sqlserver-adapter (3.0.9, 3.0.6, 3.0.5) activesupport (3.0.3, 3.0.1) archive-tar-minitar (0.5.2) arel (2.0.7, 2.0.3, 1.0.1) builder (3.0.0, 2.1.2) bundler (1.0.10, 1.0.7) capistrano (2.5.19) capistrano_winrm (0.0.1) capybara (0.4.1.1, 0.4.0) celerity (0.8.7, 0.8.6) childprocess (0.1.6) color (1.4.1) columnize (0.3.2) cucumber (0.10.0, 0.9.4) culerity (0.2.15, 0.2.13) dbi (0.4.5) deprecated (3.0.0) diff-lcs (1.1.2) ffi (1.0.5 x86-mingw32, 1.0.4 x86-mingw32, 0.6.3 x86-mingw32) gemcutter (0.6.1) gherkin (2.3.3 x86-mingw32, 2.2.9 x86-mingw32) git (1.2.5) handsoap (1.1.8, 1.1.7) highline (1.6.1) hoe (2.9.1, 2.8.0) httpclient (2.1.6.1, 2.1.6) i18n (0.5.0, 0.4.2) ironruby-dbi (0.1.0) jeweler (1.5.2, 1.5.1) json (1.5.1 x86-mingw32, 1.4.6 x86-mingw32) json_pure (1.5.1, 1.4.6) justeat (0.1.0, 0.0.2) linecache19 (0.5.11) macaddr (1.0.0) mime-types (1.16) minitest (2.0.2, 1.6.0) mssqlclient (0.1.0) net-scp (1.0.4) net-sftp (2.0.5) net-ssh (2.1.0, 2.0.23) net-ssh-gateway (1.0.1) net-ssh-multi (1.0.1) net-ssh-shell (0.1.0) nokogiri (1.4.4.1 x86-mingw32) open4 (1.0.1) Platform (0.4.0) popen4 (0.1.2) rack (1.2.1) rack-test (0.5.7, 0.5.6) rake (0.8.7) rake-dotnet (1.0.2, 1.0.1, 0.2.2, 0.2.1, 0.2.0) rake-remote_task (2.0.2) rcov (0.9.9) rdiscount (1.6.8, 1.6.5) rdoc (3.5.3, 3.1, 2.5.8) rdoc-data (2.5.3) rspec (2.5.0, 2.3.0, 2.1.0, 2.0.1) rspec-core (2.5.1, 2.3.1, 2.1.0, 2.0.1) rspec-expectations (2.5.0, 2.3.0, 2.1.0, 2.0.1) rspec-mocks (2.5.0, 2.3.0, 2.1.0, 2.0.1) ruby-debug-base19 (0.11.24) ruby-debug-ide (0.4.16) ruby-odbc (0.99994, 0.99993, 0.99992) ruby_core_source (0.1.4) rubyforge (2.0.4) rubygems-update (1.5.0) rubyntlm (0.1.1) rubyzip (0.9.4) selenium-webdriver (0.1.2) syntax (1.0.0) systemu (1.2.0) term-ansicolor (1.0.5) trollop (1.16.2) tzinfo (0.3.24, 0.3.23) uuid (2.3.1) vlad (2.1.0) webrat (0.7.3, 0.7.2) win32-api (1.4.8 x86-mingw32, 1.4.7 x86-mingw32) win32-process (0.6.5) win32console (1.3.0 x86-mingw32) windows-api (0.4.0) windows-pr (1.1.3, 1.1.2) winrm (0.0.6) xpath (0.1.3, 0.1.2) 

更新: #1239有报告说,升级到捆绑软件1.0.21或1.1可能会解决这个问题。 (感谢forforf指针!)

 gem install bundler 

这是捆绑器中的一个已知错误( #1239 )。 Larsch在Rakefile的顶部添加require'psych'的解决方法对我的Rails项目没有帮助(无论什么原因 – 它根本没有改变任何东西),但是设置RUBYOPT='-rpsych'作为解决方法,就像所以,解决了这个问题:

 RUBYOPT='-rpsych' bundle install 

(感谢摩洛指出了这一点 。)

它似乎只需要安装和更新。 应用程序本身(即调用rake等,即使bundle exec )应该继续运行,而不设置RUBYOPT。


对于后台来说,简单地要求psych模块有所作为的原因似乎是这样的:YAML 自动使用(旧的)Syck库,除非在需要YAML的时候加载Psych,在这种情况下,它使用Psych。 这种隐含的行为当然会引起很多麻烦 ,包括我们在这里看到的问题。

这个Hoe bug报告描述了一个解决方法:在Rakefile的其他部分之前添加require'psych'。 为我工作。

在debian上有类似的问题。 恢复到较早版本的捆绑软件(1.0.9)而不是1.0.10修复了这个问题。

当我尝试运行Puma作为服务器的Rails应用程序时遇到了这个问题。 答案原来是这里的人们说的,即如果没有指定,Ruby将尝试使用syck(旧的yaml解析器)而不是psych(新的yaml解析器)。 我不得不用下面几行修改config/boot.rb文件:

 require 'psych' YAML::ENGINE.yamler = 'psych' 

强制它停止使用syck并切换到psych。 之后,一切工作。