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

时间:2010-07-08 15:38:04

标签: 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

2 个答案:

答案 0 :(得分:12)

2010年7月13日更新

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

chmod o-w `cygpath $HOMEDRIVE`

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

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

SYSTEM                   (full control)
*your users*             (full control)
Administrators           (full control)

以下是比较已损坏权限与正确权限的要点:

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

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

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

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

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

答案 1 :(得分:1)

这是mkdir调用的文件系统错误。这个gem的作者用这样的方式写了他们的文件路径代码,它在win32上用反斜杠而不是正斜杠打破,导致一个被破坏的mkdir调用。看起来你的gem不支持win32。