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