将目录添加到$ LOAD_PATH(Ruby)
我已经看到了两种常用的将当前正在执行的文件的目录添加到$ LOAD_PATH(或$ :)的技巧。 如果你不使用gem,我会看到这样做的好处。 显然,一个看起来比另一个更加冗长,但是有没有理由相互配合呢?
第一,详细的方法(可能是矫枉过正):
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
和更直接,快速和肮脏的:
$:.unshift File.dirname(__FILE__)
任何理由去一个在另一个?
我想说的是使用$:.unshift File.dirname(__FILE__)
,而不是另一个,因为我已经在代码中看到了比$LOAD_PATH
更多的用法,而且它也更短了!
Ruby加载path通常被认为是写成$ :,但仅仅因为它很短,并没有使它变得更好。 如果你更喜欢聪明,或者为了自己的利益而简洁,你就不必因为其他人就这样做。 打招呼 …
$LOAD_PATH
和…说再见
# I don't quite understand what this is doing... $:
我并不太喜欢这种“快速和肮脏”的方式。 任何Ruby新手都会琢磨什么$:.
是。
我觉得这更明显。
libdir = File.dirname(__FILE__) $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
或者如果我关心有完整的path…
libdir = File.expand_path(File.dirname(__FILE__)) $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
更新 2009/09/10
到最近我一直在做以下事情:
$:.unshift(File.expand_path(File.dirname(__FILE__))) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
我在浏览GitHub的时候看到了很多不同的ruby项目。
似乎是约定?
如果您在Rails项目中键入script/console
并input$:
:,则会得到一个包含加载Ruby所需的所有目录的数组。 从这个小练习中得到的结果是$:
是一个数组。 既然如此,你可以使用unshift
方法或<<
运算符来预先考虑其他目录。 正如你在你的声明中隐含的$:
和$LOAD_PATH
是一样的。
如上所述,快速和肮脏的方式的缺点是:如果你已经在你的启动path中有目录,它会重复自己。
例:
我有一个名为todo的插件。 我的目录结构如下所示:
/ ---供应商 | | --- /插件 | | --- / TODO | | --- / lib目录 | | --- /应用 | | --- /模型 | --- /控制器 | | --- /导轨 | | --- init.rb
在init.rb文件中,我input了下面的代码:
## In vendor/plugins/todo/rails/init.rb %w{ models controllers models }.each do |dir| path = File.expand_path(File.join(File.dirname(__FILE__), '../lib', 'app', dir)) $LOAD_PATH << path ActiveSupport::Dependencies.load_paths << path ActiveSupport::Dependencies.load_once_paths.delete(path) end
请注意,我如何告诉代码块在块内执行string“模型”,“控制器”和“模型”中的操作,我重复“模型”。 (仅供参考, %w{ ... }
只是另一种告诉Ruby保存string数组的方法)。 当我运行script/console
,input以下内容:
>> puts $:
而且我input这个以便更容易阅读string中的内容。 我得到的输出是:
... ... ./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models ./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/controllers ./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
正如你所看到的,虽然这是一个简单的例子,我可以创build一个项目,我正在使用,如果你不小心,快速和肮脏的方式将导致重复的path。 更长的路将检查重复的path,并确保它们不会发生。
如果您是一位经验丰富的Rails程序员,您可能对自己正在做的事情有一个很好的理解,并且可能不会犯重复path的错误。 如果你是一个新手,我会走更长的路,直到你真正明白你在做什么。
最好的,我遇到过使用Rspec时通过相对path添加一个目录。 我发现它足够冗长,但仍然是一个不错的class轮。
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
有一个gem,可以让你设置更好,更干净的代码的负载path。 看看这个: https : //github.com/nayyara-samuel/load-path 。
它也有很好的文档