如何正确包含Ruby rakefile中的其他项目文件

时间:2015-03-18 16:03:15

标签: ruby require rakefile

我无法在Rake文件中包含其他文件。例如,我有一个version.rb文件,其中包含我想在rake文件中引用的版本号,另外,我有一个gem规范,在.gemspec文件中指定,我也想在rake中使用文件。我无法确定引用这两个文件的正确路径。事实上,这是我遇到最多问题的红宝石问题(需要声明/ LOAD_PATH),而且非常令人沮丧;由于我不确定如何解决这些问题,这个问题变得更糟。我目前正在避免使用诸如bundler之类的包处理程序,因为我需要先了解基础知识。

请参阅我的代码编辑器的附图,其中显示了项目结构(标准宝石结构,对于名为Cart的宝石,这只是一个虚拟应用程序来试验)。

Cart project structure

所以,我的rakefile.rb位于项目的根文件夹中。指定require时,指定的路径应该相对于何处?它是相对于您要求的文件还是相对于lib文件夹或其他任何文件?我正在运行rake -T,列出任务,这些是我看到的错误消息:

尝试在Rakefile.rb中要求version.rb文件:

require 'cart/version'

$ rake -T
rake aborted!
cannot load such file -- lib/cart/version
/Users/Sancho/dev/ruby/student/cart/Rakefile.rb:5:in `<top (required)>'

require 'lib/cart/version'

$ rake -T
rake aborted!
cannot load such file -- lib/cart/version
/Users/Sancho/dev/ruby/student/cart/Rakefile.rb:5:in `<top (required)>'
(See full trace by running task with --trace)

尝试在Rakefile.rb中要求cart.gemspec:

require 'cart.gemspec'

$ rake -T
rake aborted!
cannot load such file -- cart.gemspec
/Users/Sancho/dev/ruby/student/cart/Rakefile.rb:6:in `<top (required)>'
(See full trace by running task with --trace)

我使用的是Ruby版本2.0.0,rake版本0.9.6(OSX Mavericks附带的默认版本)。

(PS,我的目的是购买像RubyGems这样的Ruby IDE,但是我再次不这么做,因为我想先学习基础知识,我不想依赖于它如果我不理解如何根据第一原则修复它们,那么IDE会为我解决问题。

感谢。

1 个答案:

答案 0 :(得分:5)

  

指定require时,指定的路径应该相对于何处?它是相对于您要求的文件还是相对于lib文件夹或其他任何文件?

require_relative将与调用文件相关。

require查看$LOAD_PATH目录,除非文件路径是绝对路径。由于您的项目似乎没有在$LOAD_PATH中声明自己并且您的路径不是绝对的,因此无法找到该文件。

因为这似乎是宝石你尝试添加标准

#this will be the absolute path to lib based on the calling __FILE__
lib = File.expand_path('../lib', __FILE__)
#this will include the path in $LOAD_PATH unless it is already included
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)

这将在lib中声明$LOAD_PATH目录,然后您可以根据来自lib的路径来要求,例如require 'cart/version'