我创建了一个Ruby类Worker
,文件名是 Worker.rb :
class Worker
def initialize
...
end
def doTask(task_name)
...
end
end
然后,我创建了另一个名为 run.rb 的Ruby脚本文件(它需要Worker
):
require 'Worker'
worker = Worker.new
worker.doTask("sort")
两个ruby文件都直接位于项目文件夹下:
ProjectFolder/
-- Worker.rb
-- run.rb
我通过命令运行项目文件夹下的 run.rb :
ruby run.rb
但是得到以下错误:
/Users/John/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- Worker (LoadError)
from /Users/John/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from runme.rb:1:in `<main>'
为什么?
答案 0 :(得分:2)
在检查了@Geo&#39;的github项目后,我想知道,我应该使用:
require_relative "worker"
答案 1 :(得分:0)
require
从所谓的加载路径中查找所需的文件,而不是当前目录。由于查找当前目录的语法很尴尬,Ruby 1.9引入了require_relative
,它在当前目录中查找。
更改您的代码:
require_relative "Worker"
而不是
require "Worker"
答案 2 :(得分:-1)
这不起作用的原因是因为当前目录不是ruby的默认加载路径的一部分。
如果运行以下命令,您将看到当前的加载路径是什么,它将确认当前目录不是该路径的一部分。
ruby -e 'puts $LOAD_PATH'
这应该回答您关于为什么未加载所需文件的主要问题。
对于解决方案,require_relative
将起作用,在这种情况下可能是最佳解决方案。
但是,如果不需要,仍然有一些情况是将目录插入到加载路径中是有帮助的。例如,假设您有一个可以在文件系统中任何地方运行的脚本,并且您希望能够灵活地要求您的同事的foo类的特定版本。
/afs/some_cell/u/john/some_ruby_lib
prod/
foo.rb
bar.rb
prev/
foo.rb
bar.rb
beta/
foo.rb
bar.rb
在这种情况下,设置RUBYSIM var(可能在包装器中)或在ruby命令行上设置正确的include路径都是一个有用的解决方案。
同样,你的同事还没有把它作为一个宝石发布,他只是提供了一个共享目录。
有几种方法可以在适当的时候将目录插入到加载路径中,如下所示:
您可以使用-I命令行标志
ruby -I some_path -e 'puts $LOAD_PATH'
您可以将RUBYLIB env var设置为包含当前目录。
on unix / linix / osx
export RUBYLIB=some_path
在Windows上
设置RUBYLIB = some_path