Ruby需要'文件'和相对位置

Bob*_*y B 19 ruby require ruby-1.8 ruby-1.9.1 ruby-1.8.7

所以我正在写一些rspec测试,我对我缺乏Ruby理解感到尴尬.

我有一个如下所示的文件结构:

  • GUI_Tests /测试/ test_spec.rb
  • GUI_Tests/windows_gui.rb
  • GUI_Tests/upload_tool.rb

当我运行test_spec.rb文件的规范时,我要求包含upload_tool文件,如下所示:

spec -r ../upload_tool -fs test_spec.rb
Run Code Online (Sandbox Code Playgroud)

然后,upload_tool需要windows_gui.rb,如下所示:

require '../windows_gui'
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么我必须引用相对于test_spec.rb(需要../)而不是upload_tool.rb的windows_gui.rb?这对我来说是错误的,我想要在测试规范的上下文中使用upload_tool.rb,这意味着每次都要更改要求.

显然我遗漏了一些东西,但是如果我没有引用相对于测试规范,我得到一个文件未找到错误.

很抱歉在这里这么无知,但我空手而归.任何想法都赞赏.

BB

Adr*_*ian 20

你没有.requires是相对于当前目录的,在您的情况下是GUI_Tests/Tests.如果你这样做了:

cd ..
spec -r upload_tool -fs Test/test_spec.rb
Run Code Online (Sandbox Code Playgroud)

你必须使用这个:

require 'windows_gui' # without '../'
Run Code Online (Sandbox Code Playgroud)

解决该问题的最常见方法是使用File.dirname(__FILE__):

require File.join(File.dirname(__FILE__), '..', 'windows_gui')
Run Code Online (Sandbox Code Playgroud)

注意:在Ruby 1.9.2中需要更改它的默认值:Ruby:require vs require_relative - 在Ruby <1.9.2和> = 1.9.2中运行的解决方法的最佳实践

  • 实际上,`require`是*不*相对于当前目录,它相对于*搜索路径*(即特殊常量`$ LOAD_PATH`或其别名`$:`).它恰好发生在旧版本的Ruby上(即除了尚未发布的1.9.2之外的所有版本),当前目录(`.`)默认位于搜索路径中:`p $:.include ?('.')#=> true`.但是,从Ruby 1.9.2开始不再是这种情况,不应该依赖它.在Ruby 1.9中,您可以使用`require_relative`,它相对于从中调用的源文件而不是搜索路径. (19认同)