Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby路径管理_Ruby_Relative Path - Fatal编程技术网

Ruby路径管理

Ruby路径管理,ruby,relative-path,Ruby,Relative Path,在ruby程序中管理require路径的最佳方法是什么 让我举一个基本的例子,考虑一个结构: \MyProgram \MyProgram\src\myclass.rb \MyProgram\test\mytest.rb 如果我在测试中使用了require'../src/myclass',那么我只能从\MyProgram\test文件夹调用测试,但我希望能够从任何路径调用它 我提出的解决方案是在所有源文件中定义以下行: ROOT=“#{File.dirname(uuu File_uuu)}/

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

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

\MyProgram

\MyProgram\src\myclass.rb

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

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

ROOT=“#{File.dirname(uuu File_uuu)}/”除非定义?(ROOT)
然后始终使用
require“#{ROOT}/src/myclass”


有更好的方法吗?

这里有一个稍加修改的方法:

$LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), "..", "src"))

通过将源代码的路径预先设置为$LOAD_path(aka$:),您不必在需要代码时显式地提供根目录等,例如,
需要“myclass”
sris的答案是标准方法


另一种方法是将代码打包为gem。然后rubygems将负责确保您的库文件位于您的路径中。

相同、噪音较小的IMHO:

$:.unshift File.expand_path("../../src", __FILE__)
require 'myclass'
或者只是

require File.expand_path "../../src/myclass", __FILE__
在(Debian)Linux上使用ruby 1.8.7和1.9.0进行测试-请告诉我它是否也在Windows上工作


为什么标准库中没有内置更简单的方法(例如“use”、“require_relative”或类似的sg)?更新:require_relative从1.9.x开始就存在了这就是我最终得到的-一个Ruby版本的
setenv
shell脚本:

  # Read application config                                                       
$hConf, $fConf = {}, File.expand_path("../config.rb", __FILE__)
$hConf = File.open($fConf) {|f| eval(f.read)} if File.exist? $fConf

  # Application classpath                                                         
$: << ($hConf[:appRoot] || File.expand_path("../bin/app", __FILE__))

  # Ruby libs                                                                     
$lib = ($hConf[:rubyLib] || File.expand_path("../bin/lib", __FILE__))
($: << [$lib]).flatten! # lib is string or array, standardize                     

这对我来说效果很好,我可以在多个项目中重用setenv脚本,只需更改配置文件中的参数。这是一个比shell脚本好得多的替代方案,IMO.

从Ruby 1.9开始,您可以使用它:

require_relative '../src/myclass'
如果您在早期版本中需要它,您可以根据从extensions gem获得它


以动态方式提供绝对路径。

使用以下代码要求特定文件夹(=>Ruby 1.9)中的所有“rb”文件:


虽然这会让我感到刺痛,但这是迄今为止我在ruby内部看到的最好的选择。也就是说,我更喜欢将路径附加(而不是预加)到ruby路径,因为你不会无意中踩到标准ruby库中存在的东西。你不是说“我更喜欢预加(而不是附加)”吗?(换句话说:你真的不想确保你的东西优先吗?)我最初的例子是“$:Matt,'到目前为止,我在ruby内部看到的最好的选择'——ruby之外还有一些选择吗?像预处理器或其他什么东西一样?@inger,在ruby之外执行此操作的选项是shell变量和ruby命令行参数。@j-g-faustus:“将__; FILE _;与工作目录合并可确保我可以从任何地方调用它”:FILE.expand path(path,base)应该具有相同的效果。你确定上面英格尔的回答没有起作用吗?这给了你什么?(例如,将其放在test.rb中):“puts File.expand_path”。/../src/myclass“,_uu文件_u”没错,File.expand_path也会这样做。我已经更新了帖子。它确实变得更干净了,谢谢:)除此之外,主要的区别是,这是一个单独的脚本,在应用程序启动时运行一次,我不需要接触单个源文件。
require_relative '../src/myclass'
Pathname(__FILE__).dirname.realpath
path='../specific_folder/' # relative path from current file to required folder

Dir[File.dirname(__FILE__) + '/'+path+'*.rb'].each do |file|
  require_relative path+File.basename(file) # require all files with .rb extension in this folder
end