2010-08-29 203 views
12

我在几个文件中有不同类的Ruby代码。在一个文件中,我开始执行。这个文件require是我的其他文件。Ruby需要路径

  • 这是启动一个ruby代码的好方法吗?
  • 当我从符号链接运行代码时,例如DIR2/MyRubyCode是主文件DIR1/MyRubyCode.rb的链接,那么我的要求将会失败。我通过在require之前将路径DIR1添加到$LOAD_PATH来解决问题,但我认为会有更好的方法来完成它。你有什么建议吗?

回答

16

如果你想检查一个Ruby文件被“require‘版或’ruby MyRubyCode.rb”执行,检查__FILE__不变。

# If the first argument to `ruby` is this file. 
if $0 == __FILE__ 
    # Execute some stuff. 
end 

就require/$ LOAD_PATH问题而言,您始终可以在require语句中使用相对路径。例如:

# MyRubyCode.rb 
require "#{File.dirname(__FILE__)}/foo_class" 
require "#{File.dirname(__FILE__)}/bar_module" 

,其中将包括在同一目录MyRubyCode.rbfoo_class.rbbar_module.rb文件。

+1

谢谢但如果我需要File.dirname(__ FILE__),当我使用别名启动代码时,它也尝试从'。'包含。我仍然有'没有这样的文件加载'错误。 – 2010-08-29 17:21:40

+1

这是正确的。你将不得不得到符号链接的目标(这将代替'File.dirname()')。看看这个帖子的几种不同的方式做到这一点: http://stackoverflow.com/questions/1237939/ruby-how-do-i-get-the-target-of-a-symlink – 2010-08-29 17:36:08

+2

谢谢。它适用于'$ LOAD_PATH << File.dirname(Pathname.new(File.expand_path(__ FILE __))。realpath.to_s).to_s'。 – 2010-08-30 07:18:51

6

我知道这是一个老问题,但有一个更新的回答是,我想将它张贴:

在较新版本的Ruby的开始(我不知道的时候),你可以通过以下需要在同一个目录下的文件:

require './foo_class' 
require './bar_module' 

,它会载入文件名为在同一个目录foo_class.rbbar_module.rb

要检查您的文件是否为require d或正常运行,请检查其他答案。

+2

这个答案没有解决原始问题中的用例,因为它仍然会失败如果ruby文件正在从符号链接调用或位于用户的路径上。 – Nathan 2013-12-02 19:03:41

17

如果您使用的是Ruby 1.9或更高版本,那么您的依赖关系需要用户require_relative。

require_relative 'foo_class' 
require_relative 'bar_module'