将目录添加到$ 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 。

它也有很好的文档