为什么“--enable-load-relative”不能用于ruby安装?

时间:2014-02-06 05:08:23

标签: ruby aix

我需要在多个站点安装ruby,但是各个站点之间安装的确切位置可能略有不同。

我使用-enable-load-relative进行配置和编译。这似乎适用于我的linux安装,但不适用于aix。当我为linux配置时,我使用了

--enable-load-relative --prefix=blah --exec-prefix=blah/linux_code_rel

我能够通过执行以下操作来测试相对负载: 首先使用名为linux_code_rel的安装目录

blah/linux_code_rel/bin/ruby -e " puts 'hello' "

然后将目录重命名为linux_code后,运行

blah/linux_code/bin/ruby -e " puts 'hello' "

我两次回来hello

当我为aix做同样的事情时,它似乎不起作用。 我使用

配置和安装
 --enable-load-relative --prefix=blah --exec-prefix=blah/aix_code_rel
如果我运行

,安装后

blah/aix_code_rel/bin/ruby -e "puts 'hello' " 

我回来了

hello

如果我将aix_code_rel重命名为aix_code并运行

blah/aix_code/bin/ruby -e "puts 'hello' "

我得到了

<internal:gem_prelude>:1:in `require': cannot load such file -- rubygems.rb (LoadError)
        from <internal:gem_prelude>:1:in `<compiled>'

使用ln -s aix_code aix_code_rel创建符号链接,似乎解决了这个问题,这表明安装总是在寻找使用路径blah / aix_code_rel找到的代码,尽管我配置了{{1 }}

我似乎能够通过设置RUBYLIB env变量来解决这个问题,但这看起来很混乱,特别是考虑到linux安装似乎与相对加载有关。

任何人都知道我可能做错了什么?还有其他原因我可以设置默认的LOAD_PATH吗?也许有些安装后的配置文件?

1 个答案:

答案 0 :(得分:0)

我没有尝试过这个选项,但是在AIX上这将是一些让它起作用的技巧。

如果找到可执行文件或共享库(如miniruby或libruby.so.xxxxx)并执行:

dump -H miniruby

您将看到显示其所依赖的输出。在“导入文件字符串”下方,您将看到一个列表。第0个条目是特定可执行文件或共享库用于其“libpath”的条目。你可以制作那些相对路径。它确实有效。但这引入了一个安全风险(我最近才被告知)Ruby构建过程试图避免。

如果未在环境中设置 LIBPATH,则为。如果在环境中设置了LIBPATH,那么它将在所有情况下使用该路径。

哦......实际上有一个例外。 (我正在编辑,因为我正在键入)导入文件字符串列表中的第1到第n个条目可以是绝对路径,在这种情况下,即使LIBPATH也不会改变搜索,因为没有搜索完成。

可能有用的是在脚本中包装“ruby”,该脚本使用相同的参数设置LIBPATH然后执行exec的ruby。类似的东西:

#!/bin/sh
export LIBPATH=/blah:/ble/blah:/usr/lib:/lib
exec real-ruby "$@"

你必须做或担心的小舞蹈是如果红宝石看着argv [0]并根据它的名字做不同的事情。我不这么认为。另一部分是您可能需要设置GEM_HOME和其他一些ruby环境变量。

另一个真实的世界建议是创建一个符号链接,从而将其安装到安装它的位置。对bin和lib目录执行此操作,这可能也有效。