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

Pla*_*fan 1 ruby require rakefile

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

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

购物车项目结构

所以,我的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)>'
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

试图从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)
Run Code Online (Sandbox Code Playgroud)

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

(PS,我的目的是购买像RubyGems这样的Ruby IDE,但同样,我暂时没有这样做,因为我想首先学习基础知识,我不想依赖于IDE来解决我的问题.我不明白如何从第一原则修复它们.

谢谢.

eng*_*nky 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)
Run Code Online (Sandbox Code Playgroud)

这将断言lib目录,$LOAD_PATH然后你可以根据lib的路径来要求,例如require 'cart/version'