Ruby:Errno :: EEXIST在安装gem时意味着什么?

Gra*_*ham 4 ruby rubygems

我正在尝试安装名为activeldap的ruby gem,但是,它不会让我安装它.我不断收到各种错误,包括Errno :: EEXIST错误.我在下面添加了错误信息.有任何想法吗?

C:\Ruby\www\demo>gem install activeldap
ERROR:  While executing gem ... (Errno::EEXIST)
File exists - C:

C:\Ruby\www\demo>gem install activeldap --debug -V
Exception `NameError' at C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:164 - uninitialized constant Gem::Commands::InstallCommand
Exception `NoMethodError' at C:/Ruby187/lib/ruby/1.8/rational.rb:78 - undefined method `gcd' for Rational(1, 2):Rational
Exception `Gem::LoadError' at C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems.rb:779 - Could not find RubyGem test-unit (>= 0)

Exception `Gem::LoadError' at C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems.rb:779 - Could not find RubyGem sources (> 0.0.1)

GET http://rubygems.org/latest_specs.4.8.gz
302 Found
GET http://production.s3.rubygems.org/latest_specs.4.8.gz
200 OK
Exception `Errno::EEXIST' at C:/Ruby187/lib/ruby/1.8/fileutils.rb:243 - File exists - C:/Users/ktemplar/.gem/specs/rubygems.org%80
GET http://rubygems.org/specs.4.8.gz
302 Found
GET http://production.s3.rubygems.org/specs.4.8.gz
304 Not Modified
Installing gem locale-2.0.5
Exception `IOError' at C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/format.rb:50 - closed stream
Exception `Errno::EEXIST' at C:/Ruby187/lib/ruby/1.8/fileutils.rb:243 - File exists - C:/Ruby187/lib/ruby/gems/1.8
Exception `Errno::EEXIST' at C:/Ruby187/lib/ruby/1.8/fileutils.rb:243 - File exists - C:/Ruby187/lib/ruby/gems/1.8/gems/locale-2.0.5
Exception `Errno::EEXIST' at C:/Ruby187/lib/ruby/1.8/fileutils.rb:243 - File exists - C:/Ruby187/lib/ruby/gems/1.8/gems/locale-2.0.5/lib
C:/Ruby187/lib/ruby/gems/1.8/gems/locale-2.0.5/lib/locale.rb
Exception `Errno::ENOENT' at C:/Ruby187/lib/ruby/1.8/fileutils.rb:243 - No such file or directory - C:/Ruby187/lib/ruby/gems/1.8/gems/locale-2.0.5/lib/locale/tag
Exception `Errno::EEXIST' at C:/Ruby187/lib/ruby/1.8/fileutils.rb:243 - File exists - C:
Exception `Errno::EEXIST' at C:/Ruby187/lib/ruby/1.8/fileutils.rb:219 - File exists - C:
ERROR:  While executing gem ... (Errno::EEXIST)
    File exists - C:
        C:/Ruby187/lib/ruby/1.8/fileutils.rb:243:in `mkdir'
        C:/Ruby187/lib/ruby/1.8/fileutils.rb:243:in `fu_mkdir'
        C:/Ruby187/lib/ruby/1.8/fileutils.rb:217:in `mkdir_p'
        C:/Ruby187/lib/ruby/1.8/fileutils.rb:215:in `reverse_each'
        C:/Ruby187/lib/ruby/1.8/fileutils.rb:215:in `mkdir_p'
        C:/Ruby187/lib/ruby/1.8/fileutils.rb:201:in `each'
        C:/Ruby187/lib/ruby/1.8/fileutils.rb:201:in `mkdir_p'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/installer.rb:517:in `extract_files'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/installer.rb:500:in `each'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/installer.rb:500:in `extract_files'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/installer.rb:196:in `install'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/dependency_installer.rb:277:in `install'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/dependency_installer.rb:247:in `each'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/dependency_installer.rb:247:in `install'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/commands/install_command.rb:119:in `execute'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/commands/install_command.rb:116:in `each'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/commands/install_command.rb:116:in `execute'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/command.rb:270:in `invoke'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:134:in `process_args'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:104:in `run'
        C:/Ruby187/lib/ruby/site_ruby/1.8/rubygems/gem_runner.rb:58:in `run'
        C:/Ruby187/bin/gem:21
Run Code Online (Sandbox Code Playgroud)

Cha*_*per 12

2010年7月13日更新

这个问题很可能是由在Windows 7上安装E Text Editor引起的.为了在Windows上提供与TextMate的兼容性,E自动安装Cygwin.在安装过程中,运行bash脚本,尝试修改C:的权限.这是行:

chmod o-w `cygpath $HOMEDRIVE`
Run Code Online (Sandbox Code Playgroud)

显然,当Cygwin设置权限时,它会使Windows ACL权限变得混乱.为了保护系统根驱动器的完整性,Windows UAC执行称为虚拟化或数据重定向的操作.更多信息在这里.在我们的例子中,虚拟化不是破坏真正的根目录上的权限,而是启动并破坏VirtualStore(%localappdata%\ VirtualStore)目录上的权限,使其根不可访问(尽管其中的任何目录保持不变且可访问).当Ruby安装gems时,它会尝试访问UAC不允许的根目录C:\目录,因此它会尝试访问%localappdata%\ VirtualStore,如果你有权限损坏它就无法访问,因此你会遇到失败.

您可以通过从VirtualStore中删除错误的权限来解决此问题(您需要在资源管理器中取消隐藏受保护的系统文件以查看VirtualStore).正确的权限应该从父文件夹继承,应该是:

SYSTEM                   (full control)
*your users*             (full control)
Administrators           (full control)
Run Code Online (Sandbox Code Playgroud)

这是一个比较破坏的权限与正确权限的要点:

http://gist.github.com/471087

E的作者意识到了这个问题并正在修复.


这似乎是一个奇怪的权限错误,显然只发生在Windows 7上.尝试打开提升的命令提示符并从那里安装.这是我提升时得到的:

[C:\Users\charlesr]gem install activeldap
Successfully installed activeldap-1.2.2
1 gem installed
Installing ri documentation for activeldap-1.2.2...
Installing RDoc documentation for activeldap-1.2.2...
Run Code Online (Sandbox Code Playgroud)

如果我从标准命令提示符运行,我得到这个:

[C:\Users\charlesr]gem install activeldap
ERROR:  While executing gem ... (Errno::EEXIST)
File exists - C:
Run Code Online (Sandbox Code Playgroud)

如果有更好的解决方案,我会更新这个答案.在Windows上安装gem时提升并不是必需的,所以我们在这里看到的行为是错误的.

此处有与此问题相关的讨论:http://groups.google.com/group/rubyinstaller/browse_thread/thread/df7b7c217ad7d882