无法运行非常简单的ruby脚本

时间:2016-09-03 14:26:43

标签: ruby

我创建了一个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>'

为什么?

3 个答案:

答案 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