在ruby脚本中需要相对lib会导致lib中出现加载错误

时间:2014-01-25 09:27:54

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

这是我在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脚本中需要相关的lib而不加载整个rails环境?

1 个答案:

答案 0 :(得分:2)

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

加载路径

ruby​​查找文件的方式是搜索它的加载路径。加载路径是一个目录集合,当你说'require'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应用程序提供的那样,那么您需要自己设置加载路径。