这是我在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环境?
答案 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是一个方便的小工具,需要相对于当前文件docs的文件。
require_relative 'lib/page_retriever'
我希望这有助于指出正确的方向。
编辑:
如果您在rails应用程序中使用它,那么当您使用它时,无论如何都会加载rails环境。 Rails默认情况下会将“lib”添加到加载路径中,因此如果从rails环境加载它应该可以工作。如果您使用的是rake任务或脚本,这些内容只是随rails应用程序提供的那样,那么您需要自己设置加载路径。