【问题标题】:Requiring a relative lib in ruby script causes load error in the lib在 ruby​​ 脚本中需要相对库会导致库中的加载错误
【发布时间】:2014-02-16 09:35:18
【问题描述】:

这是我在 Rails 应用程序中的树:

/page_downloader.rb

require "./lib/page_retriver.rb"

/lib/page_retriver

require 'open-uri'
require "page_validator"
require "content_cleaner"

class ResponseCanNotBeBlank < StandardError; end

class PageRetriver
    def self.retrive(url)
          ...
    end
end

/lib/page_validator.rb /lib/content_cleaner.rb

当我运行脚本 *page_downloader.rb* 时出现错误:

/home/mariusz/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- page_validator (LoadError)
    from /home/mariusz/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /home/mariusz/Projects/webook/lib/page_retriver.rb:2:in `<top (required)>'
    from page_downloader.rb:1:in `load'
    from page_downloader.rb:1:in `<main>'

是否可以在我的 ruby​​ 脚本中要求相关库而不加载整个 rails 环境?

【问题讨论】:

  • 你使用bunlder吗?
  • 如果是,只需将 Gemfileyourproj.gemspec 文件添加到您的项目文件夹,然后使用 bundle install/exec 运行你的可执行文件

标签: ruby-on-rails ruby relative-path require


【解决方案1】:

有几种方法可以做到这一点。

加载路径

ruby 查找文件的方式是搜索它的加载路径。加载路径是目录的集合,当您说“需要“my_file”时,它会查找匹配的文件。

要查看加载路径中的内容,您可以添加:

puts $LOAD_PATH

puts $:

在您的情况下,您希望将 lib 文件夹添加到加载路径中。因此,在您的 page_downloader.rb 脚本中,您应该将 lib 添加到您的加载路径中。

$:.unshift( File.expand_path('../lib', __FILE__) )

这一行的作用是将 lib 目录添加到加载路径。所以这将是第一个检查文件的目录。从那里您无需更改您的“lib/page_retriever.rb”文件。

需要绝对路径

一个稍微难看的解决方案是为每个文件使用绝对文件路径。比如:

require file.expand_path('../lib/page_retriever', __FILE__)

使用 require_relative

Require relative 是一个方便的小工具,可以要求相对于当前文件 docs 的文件。

require_relative 'lib/page_retriever'

我希望这有助于指明正确的方向。

编辑:

如果您在 rails 应用程序中使用它,那么当您使用它时,无论如何都会加载 rails 环境。 Rails 默认将“lib”添加到加载路径,因此如果从 rails 环境加载它应该可以工作。如果您从 rake 任务或脚本中使用它,而该脚本只是随 rails 应用程序附带的,那么您需要自己设置加载路径。

【讨论】:

  • 谢谢!将 lib 路径添加到 LOAD_PATH 有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多