9

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

9 回答 9

5

找到了!我在 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 再次工作。

希望这可以帮助。

于 2009-09-18T08:19:40.700 回答
4

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

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

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

------The-start-of-the-HOW-TO--------------

如果一个人想从控制台执行一个程序,比如说 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 "

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

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

于 2011-04-27T10:26:36.363 回答
3

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

gem update --system

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

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

于 2008-09-20T23:03:25.863 回答
2

cd 到 ruby​​src/ext/zlib 怎么样,然后ruby extendconf.rb,然后makemake install

之后,重新安装 ruby​​。

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

于 2012-07-30T12:27:35.097 回答
1

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

于 2008-08-27T16:42:52.540 回答
1

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

于 2008-09-21T07:46:59.177 回答
1

如果gem update --system不起作用并重命名ruby/bin/zlib1.dllzlib.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
于 2010-09-06T07:25:34.723 回答
0

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

于 2009-08-14T09:19:27.020 回答
0

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

于 2009-10-21T12:31:47.550 回答