6

I just updated my Windows 2008 Server x64 box to rubygems 1.5.0 and now I cannot build a gem using the rake tasks (rake clobber build) that Gemcutter provides. I get the following error:

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>'

based on using a bundle containing:

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)

and the following gems installed to the system

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)
Peter Mounce
  • 4,105
  • 3
  • 34
  • 65

4 Answers4

20

Update: There are reports in #1239 that upgrading to either bundler 1.0.21 or 1.1 might fix the problem. (Thanks to forforf for the pointer!)

gem install bundler

This is a known bug (#1239) in bundler. Larsch's workaround of adding require 'psych' at the top of the Rakefile didn't help for my Rails project (for whatever reason -- it simply didn't change anything), but setting RUBYOPT='-rpsych' as a workaround, like so, solved the problem:

RUBYOPT='-rpsych' bundle install

(Thanks to Moro for pointing this out.)

It only seems to be needed for install and update. The application itself (i.e. calling rake etc., even with bundle exec) should continue to function without setting RUBYOPT.


For background, the reason why simply requiring the psych module makes a difference seems to be this: YAML automatically uses the (older) Syck library, unless Psych is loaded at the time YAML is required, in which case it uses Psych. This kind of implicit behavior, of course, causes a lot of trouble, including the problem we see here.

Jo Liss
  • 30,333
  • 19
  • 121
  • 170
  • Was having a problem with a friends windows machine and using gems that had :git => 'git://...' sources... Don't understand why.. but it worked! thanks! – Nathan Bertram Aug 13 '11 at 06:14
  • A fresh update to bundler fixed the problem for me: `gem install bundler -v1.0.21.rc`. Found via the [#1239 bug thread](https://github.com/carlhuda/bundler/issues/1239). – forforf Sep 30 '11 at 13:03
  • @forforf: Thanks! 1.0.21.rc didn't help for me, but 1.1.rc did. I've updated the answer. – Jo Liss Oct 12 '11 at 10:14
  • Thanks for the RUBYOPT method... that totally solved it for me! – Shaheen Ghiassy Jul 12 '13 at 12:58
7

This Hoe bug report describes a work-around: Add require 'psych' before anything else in the Rakefile. Works for me.

larsch
  • 961
  • 8
  • 17
1

I encountered this problem when trying to run a rails app with Puma as the server. The answer turned out to be what the people here were saying, i.e. if not specified, Ruby will try to use syck (the old yaml parser) instead of psych (the new yaml parser). I had to modify the config/boot.rb file with the following lines:

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

To force it to stop using syck and switch to psych. After that everything worked.

1

Had a similar issue on debian. Reverting to an older version of bundler (1.0.9) instead of 1.0.10 fixed the problem.

crohr
  • 46
  • 2