Ruby'require'错误:无法加载此类文件

时间:2012-03-17 14:09:38

标签: ruby require

我有一个文件,main.rb,内容如下:

require "tokenizer.rb"

tokenizer.rb文件位于同一目录中,其内容为:

class Tokenizer
    def self.tokenize(string)
        return string.split(" ")
    end
end

如果我尝试运行main.rb,我会收到以下错误:

C:\Documents and Settings\my\src\folder>ruby main.rb

C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- tokenizer.rb (LoadError)
        from C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require '
        from main.rb:1:in `<main>'

我刚注意到,如果我使用load代替require,一切正常。这可能是什么问题?

13 个答案:

答案 0 :(得分:178)

我刚试过,它适用于require "./tokenizer"。希望这会有所帮助。

答案 1 :(得分:163)

这样做:

require_relative 'tokenizer'

如果将此文件放在与tokenizer.rb位于同一目录中的Ruby文件中,则无论您当前的工作目录(CWD)是什么,它都能正常工作。

解释为什么这是最好的方法

其他答案声称您应该使用require './tokenizer',但那是错误的答案,因为只有在{{1}的同一目录中运行Ruby进程时它才会起作用如果您需要支持没有tokenizer.rb的Ruby 1.8,那么考虑使用require的唯一理由就是。

require_relative答案今天可能适合您,但它不必要地限制了您运行Ruby代码的方式。明天,如果要将文件移动到其他目录,或者只是想从其他目录启动Ruby进程,则必须重新考虑所有这些require './tokenizer'语句。

使用require访问加载路径上的文件是件好事,Ruby宝石一直这样做。但是你不应该用requirerequire开始论证,除非你做了一些非常特别的事情并且知道你在做什么。

当您编写对其环境做出假设的代码时,您应该仔细考虑要做出的假设。在这种情况下,最多有三种不同的方式来要求.文件,每种方式都有不同的假设:

  1. tokenizer:假设两个Ruby源文件之间的相对路径保持不变。
  2. require_relative 'path/to/tokenizer':假设require 'path/to/tokenizer'位于加载路径(path/to/tokenizer)上的某个目录中。这通常需要额外的设置,因为您必须在加载路径中添加一些内容。
  3. $LOAD_PATH:假设从Ruby进程的当前工作目录到require './path/to/tokenizer'的相对路径将保持不变。
  4. 我认为,对于大多数人和大多数情况,选项#1和#2中的假设更有可能随着时间的推移而成立。

答案 2 :(得分:84)

Ruby 1.9已从加载路径中删除了当前目录,因此您需要对此文件执行相对要求,正如David Grayson所说:

require_relative 'tokenizer'

没有必要用.rb作为后缀,因为Ruby足够聪明,无论如何都知道你的意思。

答案 3 :(得分:36)

require$LOAD_PATH加载文件。如果您想要相对于当前正在执行的文件而不是$LOAD_PATH的文件,请使用require_relative

答案 4 :(得分:14)

我会建议,

load './tokenizer.rb'

鉴于,您知道该文件位于同一个工作目录中。

如果您尝试相对于文件要求它,可以使用

require_relative 'tokenizer'

我希望这会有所帮助。

答案 5 :(得分:11)

另一个不错的方法是使用

将当前目录包含在加载路径中
$:.unshift('.')

你可以把它推到$ :( $ LOAD_PATH)数组中,但是unshift会强制它在加载路径的其余部分之前加载你当前的工作目录。

在加载路径中添加当前目录后,无需继续指定

 require './tokenizer' 

可以回到使用

require 'tokenizer'

答案 6 :(得分:1)

如果它位于gem lib目录中并且这是tokenizer.rb

,这将很好地工作
require_relative 'tokenizer/main'

答案 7 :(得分:0)

问题是require无法从当前目录加载。这也是我的想法,但后来我找到了thread。例如,我尝试了以下代码:

irb> f = File.new('blabla.rb')
=> #<File:blabla.rb>
irb> f.read
=> "class Tokenizer\n    def self.tokenize(string)\n        return string.split(
\" \")\n    end\nend\n"
irb> require f
LoadError: cannot load such file -- blabla.rb
        from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
        from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
        from (irb):24
        from D:/dev/Ruby193/bin/irb:12:in `<main>'

可以看出它读取文件确定,但我不能要求它(路径未被识别)。这里有适用的代码:

irb f = File.new('D://blabla.rb')
=> #<File:D://blabla.rb>
irb f.read
=> "class Tokenizer\n    def self.tokenize(string)\n        return string.split(
\" \")\n    end\nend\n"
irb> require f
=> true

如您所知,是否指定了文件正确加载的完整路径。

答案 8 :(得分:0)

我使用jruby-1.7.4编译我的ruby代码。

require 'roman-numerals.rb' 

是抛出以下错误的代码。

LoadError: no such file to load -- roman-numerals
  require at org/jruby/RubyKernel.java:1054
  require at /Users/amanoharan/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36
   (root) at /Users/amanoharan/Documents/Aptana Studio 3 Workspace/RubyApplication/RubyApplication1/Ruby2.rb:2

我从require中删除了rb并给了

require 'roman-numerals' 

工作得很好。

答案 9 :(得分:0)

对于那些绝对确定他们的相对路径是正确的人,我的问题是我的文件没有.rb扩展名! (尽管我使用RubyMine来创建文件,并选择在创建时创建Ruby个文件。)

仔细检查文件中的文件扩展名!

答案 10 :(得分:0)

第一:

$ sudo gem install colored2

并且,您应该输入密码

然后:

$ sudo gem update --system  

外观 更新rubygems-update 错误:执行gem时...(OpenSSL :: SSL :: SSLError)     主机名&#34; gems.ruby-china.org&#34;与服务器证书不匹配

然后:

$  rvm -v
$ rvm get head

最后 你想用什么语言? [Swift / ObjC]

  

ObjC

您是否要在图书馆中加入演示应用程序? [是/否]

  

您将使用哪些测试框架? [Specta / Kiwi / None]

  

您想进行基于视图的测试吗? [是/否]

  

没有

你的班级前缀是什么?

  

XMG

在新库上运行pod安装。

答案 11 :(得分:0)

如何在搜索路径中包含当前目录?

server {
        listen 80;
        server_name example.com www.example.com;

        root /var/www/laravel/public; #LINE-ADDED

        index index.php index.html index.htm; #LINE-ADDED

        # other code here ...
}

答案 12 :(得分:-1)

你需要给出路径。 至少你应该从当前目录中提供路径。它肯定会起作用。 ./filename