首先,我感谢提出解决缺失 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------------