默认情况下“需要”查找的路径是啥?

Posted

技术标签:

【中文标题】默认情况下“需要”查找的路径是啥?【英文标题】:What are the paths that "require" looks up by default?默认情况下“需要”查找的路径是什么? 【发布时间】:2012-03-17 11:22:13 【问题描述】:

在 Ruby 中,有人告诉我这样做时

require "some_file"

Ruby 会在某些地方寻找文件。

我知道它会寻找some_file.rb,但它默认在哪里寻找呢?

【问题讨论】:

【参考方案1】:

这取决于您的平台以及 Ruby 的编译方式,因此对此没有“最佳”答案。你可以通过运行找到:

ruby -e 'puts $:'

不过,通常情况下,您拥有标准、站点和供应商 Ruby 库路径,包括每个路径下的 arch、版本和常规目录。

【讨论】:

有一个“the”的答案。 $: 或 $LOAD_PATH 变量确实给出了被搜索位置的完整列表。您自己注意到了一种简单而干净的打印方式...... 啊。取决于你如何阅读这个问题:这个 Ruby 的外观有“答案”,但如果你运行不同的 Ruby 或在不同的平台上,它会改变。例如:MRI 1.8.7 和 REE 将使用不同的路径,或者 Darwin 和 Linux MRI 使用细微不同的路径。我不确定是哪个,所以对这个答案感觉更舒服。 确实如此,尽管我猜提问者只是想知道如何找出加载路径,而不是假设它跨平台是恒定的。 你可能是对的。第一次读的时候感觉比较复杂。 :)【参考方案2】:

Ruby 查看$LOAD_PATH 数组中指定的所有路径。

您也可以像这样添加目录进行搜索:

$LOAD_PATH.unshift File.expand_path('../path/from/this/file/to/another/directory', __FILE__)

【讨论】:

【参考方案3】:

可以通过设置 RUBYLIB 环境变量来指定其他路径

【讨论】:

【参考方案4】:

$LOAD_PATH 全局变量(也称为 $:)包含要搜索的目录列表。

见:http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-require

【讨论】:

【参考方案5】:

require(string) => true or false

Ruby 尝试加载名为 string 的库,如果成功则返回 true。如果文件名没有解析为绝对路径,则会在 $: 中列出的目录中搜索它。如果文件具有扩展名“.rb”,则将其作为源文件加载;如果扩展名是“.so”、“.o”或“.dll”,或者当前平台上的任何默认共享库扩展名,Ruby 会将共享库作为 Ruby 扩展名加载。否则,Ruby 会尝试在名称中添加“.rb”、“.so”等。已加载特征的名称添加到 $: 中的数组中。

【讨论】:

【参考方案6】:

在命令行上调用ruby 时,您可以使用-I 参数提供额外的搜索路径。比较

的输出
$ ruby -e 'puts $:'

输出

$ ruby -I /tmp -e 'puts $:'

注意第二个如何将/tmp 列为选项。您可以使用多个-I添加多个路径。

您也可以将它与 shebang 一起使用:

#!/usr/bin/ruby -I /tmp -I /usr/local/lib/ruby

【讨论】:

以上是关于默认情况下“需要”查找的路径是啥?的主要内容,如果未能解决你的问题,请参考以下文章

链接库

在默认情况下可枚举设置为 false 的 JS 中创建对象属性的其他方法是啥?

Go语言中如何设置包的查找路径

默认情况下,groovy 在哪里查找属性文件?

linux下如何设置命令的默认路径

linux下如何设置命令的默认路径