题
我正在尝试安装一些 Ruby Gems,以便在收到 Twitter 消息时可以使用 Ruby 来通知我。然而,在做了一个 gem update --system
, ,现在每次我尝试执行以下操作时都会出现 zlib 错误 gem install
任何东西。下面是我尝试安装 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/
解决方案
我今晚也刚开始得到这个。谷歌搜索发现了一堆没有提供结果的建议
gem update --system
还有一些来自 jamis 的粘贴代码应该替换 package.rb 中的函数,但它应该替换的原始代码却找不到。
重新安装 rubygems 没有帮助。我现在正在重新安装 ruby......并且它已修复。虽然很痛。
其他提示
找到了!我在 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 再次发挥作用。
希望这可以帮助。
首先,我感谢提出解决 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"
并通过关闭终端窗口并打开一个新的窗口,然后将IRB键入控制台,/home/scoobydoo/yourcompiledruby/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)=============================
从以下位置下载并解压源 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 配置脚本使用并重新编译。(抱歉,目前我没有更好的解决方案。)
可能是一个肮脏的解决方案,可能是将以下行添加到/home/scoobydoo/.bashrc
alias gem="`which ruby` `which gem` "
alias irb="`which ruby` `which irb` "
其实我经常用
alias irb="`which ruby` -KU "
但是应该在不给 ruby 提供“-KU”参数的情况下执行 gem,因为否则会出现错误。
------操作方法结束------------------------
重新安装 Ruby 解决了这个问题。这不是我想要的;我想知道为什么我会遇到这个问题,但一切都解决了。
当您的下载失败时,它通常会出现 - 即由于网络超时、手动下载错误或其他原因,您的 gem 已损坏。再试一次,或者手动下载宝石并点 gem
在文件中。
如果 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
cd 进入 rubysrc/ext/zlib 怎么样,然后 ruby extendconf.rb
, , 然后 make
, make install
.
之后,重新安装 ruby。
我在ubuntu 10.04上做了这个并且成功了。
如果其他方法都失败,请安装纯 ruby zlib