【问题标题】:Ruby require 'file' and relative locationRuby 需要“文件”和相对位置
【发布时间】:2011-03-16 13:18:54
【问题描述】:

所以我正在编写一些 rspec 测试,但我对自己缺乏对 Ruby 的理解感到很尴尬。

我的文件结构如下所示:

  • GUI_Tests/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

那么upload_tool需要windows_gui.rb,像这样:

require '../windows_gui'

我的问题是,为什么我必须参考相对于 test_spec.rb(需要 ../)而不是 upload_tool.rb 的 windows_gui.rb?这对我来说感觉不对,我会想在测试规范之外使用upload_tool.rb,这意味着每次都要改变需求。

显然我遗漏了一些东西,但如果我没有参考与测试规范相关的内容,我会收到一个未找到文件的错误。

很抱歉在这里如此无知,但我空手而归。任何想法表示赞赏。

BB

【问题讨论】:

标签: ruby require ruby-1.8 ruby-1.8.7 ruby-1.9.1


【解决方案1】:

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

cd ..
spec -r upload_tool -fs Test/test_spec.rb

你必须使用这个:

require 'windows_gui' # without '../'

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

require File.join(File.dirname(__FILE__), '..', 'windows_gui')

注意:在 Ruby 1.9.2 中需要更改它的默认值:Ruby: require vs require_relative - best practice to workaround running in both Ruby <1.9.2 and >=1.9.2

【讨论】:

  • 完美 - 就像我说的,我什至不得不问,但我很高兴我做到了。这很有道理。
  • 其实require相对于当前目录,它是相对于搜索路径(即特殊常量$LOAD_PATH或其别名 $: )。碰巧的是,在旧版本的 Ruby 上(即除了尚未发布的 1.9.2 之外的所有版本),当前目录(.)默认位于搜索路径中:p $:.include?('.') # =&gt; true。但是,从 Ruby 1.9.2 开始,情况不再如此,也不应该依赖它。在 Ruby 1.9 中,您可以使用require_relative,它与调用它的源文件相关,而不是搜索路径。
  • @Jorg:但是如果我在 1.9 中运行它:$:.replace []; require '../somefile',它可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
相关资源
最近更新 更多