【问题标题】:cannot install ruby gems - zlib error无法安装 ruby​​ gems - zlib 错误
【发布时间】:2010-09-06 21:27:27
【问题描述】:

我正在尝试安装一些 Ruby Gems,以便在收到 Twitter 消息时使用 Ruby 通知我。但是,在执行 gem update --system 之后,现在每次尝试执行 gem install 的任何操作时都会出现 zlib 错误。下面是我在尝试安装 ruby​​ gem 时得到的控制台输出。 (以及来自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/

【问题讨论】:

    标签: ruby gem


    【解决方案1】:

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

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

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

    然后去 ruby​​/lib/ruby/site_ruby/1.8./i386-msvcrt 并删除那里的zlib.so文件。

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

    还有多田! Rubygems 再次工作。

    希望这会有所帮助。

    【讨论】:

    • 对我来说,我所要做的就是将ruby/bin/zlib1.dll 重命名为zlib.dll。它解决了所有问题。
    【解决方案2】:

    首先,我感谢提出解决缺失 zlib 问题的人。 (不是我。:-)

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

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

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

    如果想从控制台执行一个程序,比如说 irb,那么会按照名为 PATH 的环境变量描述的顺序从文件夹中搜索名为 irb 的文件。可以通过键入 bash shell(并按 Enter 键)查看 PATH 的值:

    echo $PATH
    

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

    如果有人写信给 /home/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"
    

    到 /home/scoobydoo/.bashrc ,那么 /usr/bin/irb 就会被执行。

    在实践中想写

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

    因为这会将 PATH 在分配到 /home/scoobydoo/ourcompiledruby/bin 之前的所有值预先添加。否则会出现问题,因为并非所有常用工具都位于 /usr/bin 中,并且可能希望使用多个自定义构建的应用程序。

    同样的逻辑也适用于库,只是环境变量的名称是 LD_LIBRARY_PATH

    使用 LD_LIBRARY_PATH 和 PATH 允许没有 root 访问权限或想要试验不受信任的软件的普通用户构建和使用它们,而无需任何 root 权限。

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

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

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

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

    将以下 2 行添加到 /home/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 等将头文件放在 /usr/include 和库文件到 /usr/lib

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

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

    ./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 配置脚本并重新编译。 (抱歉,目前我没有更好的解决方案。)

    可能是一个肮脏的解决方案可能是将以下行添加到 /home/scoobydoo/.bashrc

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

    其实我一般都用

    alias irb="`which ruby` -KU "
    

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

    --------The-end-of-the-HOW-TO------------------------

    【讨论】:

    • 感谢您的指导,我只需运行apt-get install zlibc zlib1g-dev zlib1g libxml2-dev就可以在我的ubuntu系统上使用它了
    【解决方案3】:

    我今晚也刚开始收到这个。谷歌搜索发现了一堆没有结果的建议

    gem update --system
    

    还有一些来自 jamis 的代码粘贴,这些代码应该替换 package.rb 中的一个函数,但它应该替换的原始代码无处可寻。

    重新安装 ruby​​gems 没有帮助。我现在正在重新安装 ruby​​ ......并且它已修复。虽然很痛。

    【讨论】:

    • 它实际上是在执行此操作时发生的 :(
    【解决方案4】:

    cd到rubysrc/ext/zlib怎么样,然后ruby extendconf.rb,然后make,make install。

    之后,重新安装 ruby​​。

    我在 ubuntu 10.04 上做了这个并且成功了。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 就我而言,我认为问题在于我在 rails 2.1.0 和 2.1.2 之间来回切换,并且我认为依赖项安装导致事情最终失控
      • 将 rails 冻结到您的应用程序中,这样您就不需要单独的 gem 并且不会发生冲突。
      【解决方案6】:

      它最常在您的下载失败时出现 - 即由于网络超时、手动下载错误或其他原因,您的 gem 已损坏。只需再试一次,或手动下载 gem 并将 gem 指向文件。

      【讨论】:

        【解决方案7】:

        如果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
        

        【讨论】:

          【解决方案8】:

          在你做任何其他事情之前尝试更新ZLib。我在 OS X 上遇到了类似的问题,更新 Compress::Zlib(ZLib 的 Perl 接口)解决了它 - 所以我认为旧版本的 ZLib(现在是 1.2.3)可能是你的问题所在......

          【讨论】:

            【解决方案9】:

            如果一切都失败了,安装纯 ruby​​ zlib

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-05-09
              相关资源
              最近更新 更多