我有一个项目树如下:
├── bin
├── fpgrowth-ruby-0.0.1.gem
├── fpgrowth-ruby.gemspec
├── Gemfile
├── Gemfile.lock
├── lib
│ ├── fpgrowth
│ │ ├── fptree
│ │ │ ├── builder
│ │ │ │ ├── first_pass.rb
│ │ │ │ └── second_pass.rb
│ │ │ ├── fp_tree.rb
│ │ │ └── node.rb
│ │ ├── models
│ │ │ └── transaction.rb
│ │ └── ruby
│ │ └── version.rb
│ └── fpgrowth.rb
├── LICENSE.txt
├── Rakefile
├── README.md
└── test
└── tc_first_pass.rb
在first_pass的测试用例中,我写道:
require 'test/unit'
require "../lib/fpgrowth/fptree/builder/first_pass"
然后我明白了:
ruby test/tc_first_pass.rb
/home/damien/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- ../lib/fpgrowth/fptree/builder/first_pass (LoadError)
from /home/damien/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from test/tc_first_pass.rb:2:in `<main>'
出了点问题,但我不知道是什么。
答案 0 :(得分:1)
除非您使用require_relative
,否则不能要求此类文件。
除此之外,您应该更改$LOAD_PATH
以包含../lib
。
答案 1 :(得分:1)
在ruby命令行上使用-I标志,以在运行时指定require路径。
来自您的顶级目录
ruby -I lib test/tc_first_pass.rb
上面告诉ruby解释器只在这个执行的加载路径中包含/ lib。
然后是你的需求行,
require 'fpgrowth/fptree/builder/first_pass'
对于宝石构建和组织您的源代码,我建议您阅读有关组织源代码的章节,以及从此处的Programming Ruby书籍中分发和打包您的代码:http://pragprog.com/book/ruby3/programming-ruby-1-9
答案 2 :(得分:0)
您可以使用File类方法来帮助您。
首先是从不相对于cwd
的目录开始,而是相对于调用require的文件。它们可能不一样。
require File.dirname(__FILE__) + "../lib/fpgrowth/fptree/builder/first_pass"
然而,这不是非常便携,可以使用join
类方法进行清理:
require File.join(File.dirname(__FILE__), '..', 'lib', 'fpgrowth', 'fptree', 'builder', 'first_pass')
但是你可能发现自己在这个地方添加了这个,不是吗?在这种情况下,请考虑在fpgrowth.rb
中添加帮助:
def self.root
Pathname.new(File.expand_path(File.dirname(__FILE__)))
end
现在,您可以在整个地方使用该助手:
FpGrowth.root #=> "/absolute/path/to/fpgrowth/lib"
FpGrowth.root.join("fpgrowth", "fbtree", "builder") #=> "/absolute/path/to/fpgrowth/lib/fpbrowth/fbtree/builder"