【问题标题】:Ruby - working with `require` commandRuby - 使用 `require` 命令
【发布时间】:2011-02-20 17:45:07
【问题描述】:

我正在编辑一个gem,其中有通常的require 命令,指向加载的gem(我正在谈论的gem 称为nirvana,其中的文件包含require 'nirvana'、@987654324 @ 等等)。

当我使用应用程序的 bin 文件 (/mypath/nirvana/bin/nirvana) 时,我希望在其中写入的 require 'nirvana' 命令指向该 gem 的本地分支中的文件(我正在编辑的文件),并且我不想加载与经典gem install 一起安装的原始 nirvana gem。

我不想用

替换所有require 'nirvana' 命令
require File.dirname(File.expand_path(__FILE__)) + '/../lib/nirvana.rb'

...这将解决我的问题,但它很丑!有没有办法不加载 nirvana gem,并让require 'nirvana' 加载我的库(也许将它们添加到 $LOAD_PATH...)?

【问题讨论】:

    标签: ruby require


    【解决方案1】:

    您可能会在 1.9+ 中遇到 requirerequire_relative 的难题。

    require 适合加载通过普通 gems 路径加载的 gem,即安装到 Ruby 的空间中。

    require_relative 适用于相对于特定文件进行加载,例如,如果您正在加载您编写的模块,并且该模块位于您的同一目录或子目录或相对目录中。

    `require_relative 'some/sub/dir/to/file'`
    

    【讨论】:

    • require_relative 是一个值得赞赏的发现,如果您不介意与 1.8 的兼容性,它会非常有用。 (同样在这种情况下,您可以根据RUBY_VERSION 实现该方法)。谢谢!
    【解决方案2】:

    如果您从 gems 二进制可执行文件中这样做,您应该只“需要”nirvana.rb 一次。所以这条线只需要出现一次。在这些文件中看到它是很常见的。

    请注意,您的示例可以更好地写成

    require File.expand_path('../lib/nirvana.rb', __FILE__)
    

    File::expand_path 采用可选的第二个参数(目录字符串)。

    许多作者还会在执行二进制文件之前将 lib 目录转移到 $LOAD_PATH 中,以便在尝试加载任何已安装的 gem 之前加载本地文件。

    【讨论】:

    • File.expand_path 有两个参数是一个很好的建议。此外,我不知道可以使用 $LOAD_PATH 覆盖加载。
    • 是的,如果您将“lib”目录移动到 $LOAD_PATH(确保它已移动,因此它位于任何 ruby​​gem 加载路径之前),然后您可以在其中使用 require 'nirvana/something'你的 nirvana.rb 文件
    【解决方案3】:

    如果您使用的是rvm,请查看gemsets。您可以创建一个未安装 nirvana gem 的 gemset,然后当您 require 'nirvana' 时,您只会获得所需的本地库,因为没有要包含的 nirvana gem。

    (我假设您使用的是 ruby​​ 1.9,就像您使用的是 1.8 一样,您可以省略 require 'rubygems'。)

    【讨论】:

    • 这也是一个很好的答案,但我不想需要 Rvm 来解决这个问题......不过,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2014-05-18
    • 2019-10-11
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多