Ruby路径管理

27 ruby relative-path

在ruby程序中管理require路径的最佳方法是什么?

让我举一个基本的例子,考虑一个结构,如:

\MyProgram

\MyProgram\src\myclass.rb

\MyProgram\test\mytest.rb
Run Code Online (Sandbox Code Playgroud)

如果我在我的测试中使用,require '../src/myclass'那么我只能从\MyProgram\test文件夹中调用测试,但我希望能够从任何路径调用它!

我想出的解决方案是在所有源文件中定义以下行:

ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(ROOT) 然后总是使用 require "#{ROOT}/src/myclass"

有没有更好的方法呢?

Dav*_*pak 30

从Ruby 1.9开始,您可以使用require_relative执行此操作:

require_relative '../src/myclass'
Run Code Online (Sandbox Code Playgroud)

如果你需要这个版本的早期版本,你可以根据此SO评论从extensions gem获取它.


sri*_*ris 12

这是一个稍微修改过的方法:

$LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), "..", "src"))
Run Code Online (Sandbox Code Playgroud)

通过将源路径预先添加到$ LOAD_PATH(又名$ :),当您需要代码时,您不必明确提供根等. require 'myclass'


ing*_*ger 9

相同,嘈杂的恕我直言:

$:.unshift File.expand_path("../../src", __FILE__)
require 'myclass'
Run Code Online (Sandbox Code Playgroud)

要不就

require File.expand_path "../../src/myclass", __FILE__
Run Code Online (Sandbox Code Playgroud)

在(Debian)Linux上使用ruby 1.8.7和1.9.0进行测试 - 请告诉我它是否适用于Windows.

为什么一个更简单的方法(例如'use','require_relative',或者像这样的sg)没有内置到标准的lib中?更新:require_relative从1.9.x开始