代码之家  ›  专栏  ›  技术社区  ›  seanyboy

无法安装Ruby Gems-zlib错误

  •  9
  • seanyboy  · 技术社区  · 16 年前

    我正在尝试安装一些Ruby gems,以便在收到Twitter消息时使用Ruby通知我。但是,在做了一个 gem update --system ,现在每次尝试执行 gem install 任何事情。下面是我在安装RubyGems时得到的控制台输出。(以及 gem environment )

    C:\data\ruby>gem install twitter
    ERROR:  While executing gem ... (Zlib::BufError)
        buffer error
    
    C:\data\ruby>gem update --system
    Updating RubyGems
    ERROR:  While executing gem ... (Zlib::BufError)
        buffer error
    
    C:\data\ruby>gem environment
    RubyGems Environment:
      - RUBYGEMS VERSION: 1.2.0
      - RUBY VERSION: 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
      - INSTALLATION DIRECTORY: c:/ruby/lib/ruby/gems/1.8
      - RUBY EXECUTABLE: c:/ruby/bin/ruby.exe
      - EXECUTABLE DIRECTORY: c:/ruby/bin
      - RUBYGEMS PLATFORMS:
        - ruby
        - x86-mswin32-60
      - GEM PATHS:
         - c:/ruby/lib/ruby/gems/1.8
      - GEM CONFIGURATION:
         - :update_sources => true
         - :verbose => true
         - :benchmark => false
         - :backtrace => false
         - :bulk_threshold => 1000
      - REMOTE SOURCES:
         - http://gems.rubyforge.org/
    
    9 回复  |  直到 16 年前
        1
  •  3
  •   Zombo tliff    12 年前

    我今晚也刚开始买这个。googling发现了一系列无法提供结果的建议

    gem update --system
    

    还有一些来自jamis的粘贴代码,这些代码本应替换package.rb中的函数,但原本应该替换的代码却找不到。

    重新安装rubygems没有帮助。我正在重新安装Ruby………它已经修复了。虽然疼痛。

        2
  •  5
  •   user175397    15 年前

    找到它了!我在Windows上也遇到了同样的问题(它突然出现,没有我进行更新,但无论如何):

    它与多个冲突的zlib版本有关(我认为)。

    在ruby/lib/ruby/1.8/i386-msvcrt中,确保存在zlib.so文件。就我而言,它已经存在了。如果没有,您可以尝试安装RubyZlib。

    然后转到ruby/lib/ruby/site_ruby/1.8./i386 msvcrt并删除其中的zlib.so文件。

    在ruby/bin中,应该有一个zlib1.dll。出于某种原因,我的Ruby版本没有使用这个dll。我下载了最新版本(1.2.3)并安装在那里。我必须将其重命名为zlib.dll才能使用。

    还有塔达!鲁比格姆斯又开始工作了。

    希望这有帮助。

        3
  •  4
  •   Martin Vahi    13 年前

    首先,我感谢那个人,他提出了解决丢失zlib问题的方法。(不是我。:-)

    不幸的是,我失去了原始文章的链接,但是Linux上解决方案的本质是编译Ruby,而Ruby配置脚本可以使用zlib头文件。在Debian上,这意味着在开始编译Ruby之前必须安装zlib开发包。

    本文的其余部分不包含任何新内容,如果您对在类似Unix的操作系统中定制执行环境感到满意,建议您省略这些内容。下面是一些基础知识的简要介绍和分步说明的组合。

    ------如何开始---------------------

    如果你想从控制台执行一个程序,比如说IRB,那么从文件夹中搜索名为IRB的文件,其顺序由名为path的环境变量描述。可以通过键入bash shell(然后按Enter键)来查看路径的值:

    echo $PATH
    

    例如,如果系统中有两个版本的IRB,一个由“官方”软件包管理系统安装,比如yum或apt-get,到/usr/bin/irb,另一个由名为scoobydoo的用户编译并驻留在/home/scoobydoo/ourcompiledRuby/bin中,那么问题就出现了,这两个IRB-s中的哪一个被执行了。

    如果有人写信给 /主页/scoobydoo/.bashrc 一条线:

    export PATH="/home/scoobydoo/ourcompiledruby/bin:/usr/bin"
    

    并通过关闭终端窗口并打开一个新窗口重新启动bash shell,然后在控制台中键入irb, /home/scoobydoo/ourcompiledRuby/bin/irb将被执行。如果一个人写了

    export PATH="/usr/bin:/home/scoobydoo/ourcompiledruby/bin"
    

    到 /主页/scoobydoo/.bashrc ,则执行/usr/bin/irb。

    在实践中,人们想写作

    export PATH="/home/scoobydoo/ourcompiledruby/bin:$PATH"
    

    因为这会将路径在分配给/home/scoobydoo/ourcompiledRuby/bin之前拥有的所有值都预先处理好。否则会出现问题,因为并非所有的通用工具都位于/usr/bin中,并且其中一个可能希望使用多个自定义构建的应用程序。

    同样的逻辑也适用于库,除了环境变量的名称是ld_library_path

    使用ld_库的路径和路径允许普通用户,他们没有根访问权,或者想尝试使用不受信任的软件,来构建和使用它们,而不需要任何根权限。

    这个迷你版的其余部分假设我们将构建自己的Ruby版本并使用自己的Ruby版本,几乎不管发行版的官方软件包管理软件在系统上安装了什么。

    1)=================

    首先,创建几个文件夹并设置环境变量,这样文件夹就“有用”。

    mkdir /home/scoobydoo/ourcompiledruby
    mkdir -p /home/scoobydoo/lib/our_gems
    

    一个将以下两行添加到 /主页/scoobydoo/.bashrc

    export PATH="/home/scoobydoo/ourcompiledruby/bin:$PATH"
    export GEM_HOME="/home/scoobydoo/lib/our_gems"
    

    通过关闭当前终端窗口并打开新窗口或通过键入重新启动bash shell

    bash
    

    在当前打开的窗口的命令行上。 对/home/scoobydoo/.bashrc的更改对保存/home/scoobydoo/.bashrc的修改版本之前启动的终端窗口/会话没有任何影响。 其思想是在会话开始时自动执行/home/scoobydoo/.bashrc,即使有人通过ssh登录。

    2)=================

    现在,可以确保系统上有zlib开发包。截至2011年4月,我还没有整理出细节,但是

    apt-get install zlibc zlib1g-dev zlib1g
    

    在Debian系统上似乎已经足够了。其思想是,库文件和头文件都可以在系统的“官方”搜索路径中找到。通常apt-get和simile将头文件放在/usr/include,库文件放在/usr/lib

    3)=================

    从下载并解包源tar.gz http://www.ruby-lang.org

    ./configure --prefix=/home/scoobydoo/ourcompiledruby
    make
    make install
    

    4)=================

    如果控制台命令

    which ruby
    

    打印到控制台

    /home/scoobydoo/ourcompiledruby/bin/ruby
    

    那么新编译的版本就是在命令上执行的版本

    ruby --help
    

    5)=================

    其余的程序、gem、irb等可以通过以下命令正确执行:

    ruby `which gem` install rake
    ruby `which irb`
    

    这不应该是这样的,但截至2011年4月,我还没有找到任何更优雅的方式来做这件事。如果

    ruby `which gem` install rake
    

    再次给出zlib丢失的错误,然后应该尝试找出如何使zlib包含的文件和库可用于Ruby配置脚本并重新编译。(抱歉,目前我没有更好的解决方案。)

    可能是脏的解决方案可能是将以下行添加到 /主页/scoobydoo/.bashrc

    alias gem="`which ruby` `which gem` "
    alias irb="`which ruby` `which irb` "
    

    实际上,我通常用

    alias irb="`which ruby` -KU "
    

    但是gem应该在不给ruby“-ku”参数的情况下执行,否则会出现错误。

    ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-

        4
  •  1
  •   seanyboy    16 年前

    重新安装Ruby解决了这个问题。这不是我想要的;我想知道我为什么会遇到这个问题,但一切都解决了。

        5
  •  1
  •   Asaf Bartov    16 年前

    它最常出现在下载失败的时候——也就是说,由于网络超时、错误的手动下载或其他原因,您的gem损坏了。再试一次,或者手动下载gems并指向 gem 在文件上。

        6
  •  1
  •   azproduction    14 年前

    如果 gem update --system 不工作和重命名 ruby/bin/zlib1.dll zlib.dll 不帮助尝试:

    打开文件 RUBY_DIR\lib\ruby\site_ruby\1.8\rubygems.rb

    并取代现有的 def self.gunzip(data) 通过:

      def self.gunzip(data)
        require 'stringio'
        require 'zlib'
        data = StringIO.new data
    
        # Zlib::GzipReader.new(data).read
        data.read(10) # skip the gzip header
        zis = Zlib::Inflate.new(-Zlib::MAX_WBITS)
        is = StringIO.new(zis.inflate(data.read))
      end
    
        7
  •  1
  •   Nat Ritmeyer    12 年前

    那么,把cd转换成rubysrc/ext/zlib怎么样? ruby extendconf.rb 然后 make , make install .

    完成后,重新安装Ruby。

    我在Ubuntu10.04上做了这个,并且很成功。

        8
  •  0
  •   Dave Everitt    15 年前

    尝试更新 ZLib 在你做其他事情之前。我在OSX和更新方面也遇到了类似的问题 Compress::Zlib (zlib的Perl接口)修复了它-所以我认为是 ZLib (现在是1.2.3)可能是你的问题所在…

        9
  •  0
  •   rogerdpack    15 年前

    如果所有其他操作都失败,请安装pure ruby zlib