Ruby'需要'错误:无法加载这样的文件
我有一个文件,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
一切正常。 这里可能有什么问题?
我只是试过,它require "./tokenizer"
。 希望这可以帮助。
只要这样做:
require_relative 'tokenizer'
如果你把它放在与tokenizer.rb
位于同一目录的Ruby文件中,无论你当前的工作目录(CWD)是什么,它都可以正常工作。
解释为什么这是最好的方法
其他答案声称你应该使用require './tokenizer'
,但是这是错误的答案,因为它只有在你运行你的Ruby进程到tokenizer.rb
所在的同一个目录时才有效。使用这样的require
将是如果您需要支持Ruby 1.8,其中没有require_relative
。
require './tokenizer'
答案今天可能适用于您,但是它不必要地限制了您可以运行Ruby代码的方式。 明天,如果你想把你的文件移动到不同的目录,或者只是想从一个不同的目录开始你的Ruby进程,你将不得不重新思考所有这些require
语句。
使用require
访问加载path上的文件是很好的事情,Ruby的gem一直在做。 但是,你不应该开始争论, require
一个.
除非你正在做一些非常特别的事情,并且知道你在做什么。
当你编写对其环境进行假设的代码时,你应该仔细考虑要做出什么假设。 在这种情况下,有多达三种不同的方法来要求tokenizer
文件,并且每个都做出不同的假设:
-
require_relative 'path/to/tokenizer'
:假设两个Ruby源文件之间的相对path将保持不变。 -
$LOAD_PATH
require 'path/to/tokenizer'
:假设path/to/tokenizer
位于加载path($LOAD_PATH
)中的一个目录中。 这通常需要额外的设置,因为您必须将某些内容添加到加载path。 -
require './path/to/tokenizer'
path/to/tokenizer.rb
require './path/to/tokenizer'
:假定从Ruby进程的当前工作目录到tokenizer.rb
的相对path将保持不变。
我认为,对于大多数人和大多数情况,选项#1和#2中的假设更可能随着时间的推移而成立。
Ruby 1.9已经从加载path中删除了当前目录,所以你需要在这个文件上做相对的要求,正如David Grayson所说:
require_relative 'tokenizer'
没有必要用.rb
作为后缀,因为Ruby很聪明,无论如何也知道你的意思。
require
从$LOAD_PATH
加载一个文件。 如果您想要相对于当前正在执行的文件而不是$LOAD_PATH
,请使用require_relative
。
我会build议,
load './tokenizer.rb'
鉴于,你知道该文件是在同一个工作目录。
如果你想要相对于文件,你可以使用
require_relative 'tokenizer'
我希望这有帮助。
另一个不错的方法是将当前目录包含在加载path中
$:.unshift('.')
你可以把它推到$:($ LOAD_PATH)数组上,但是unshift会迫使它在加载path的其余部分之前加载你当前的工作目录。
一旦你将你的当前目录添加到你的加载path中,你不需要继续指定
require './tokenizer'
并可以回到使用
require 'tokenizer'
require_relative 'tokenizer/main'
这将很好地工作,如果它在一个gem lib目录,这是tokenizer.rb
问题是require
不从当前目录加载。 这也是我想的,但是我发现了这个线程 。 例如,我尝试了下面的代码:
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>'
正如可以看到它读取文件好,但我不能要求它(path无法识别)。 这里是代码的作品:
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
正如你可以看到,如果你指定完整的path文件加载正确。
我用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
我从需求中删除了rb,并给了
require 'roman-numerals'
它工作正常。
对于那些绝对确定他们的相对path是正确的,我的问题是我的文件没有'.rb'扩展名! (即使我使用RubyMine来创build文件,并select它们是创build时的ruby文件)。
仔细检查资源pipe理器中的文件扩展名!
第一:
$ sudo gem install colored2
而且,你应该input你的密码
然后 :
$ sudo gem update --system
出现更新rubygems-update错误:执行gem时(OpenSSL :: SSL :: SSLError)主机名“gems.ruby-china.org”与服务器证书不匹配
然后:
$ rvm -v $ rvm get head
最后你想用什么语言? [Swift / ObjC]
ObjC
你想包括一个演示应用程序与您的图书馆? [是/否]
是
你会使用哪个testing框架? [Specta / Kiwi /无]
没有
你想做基于视图的testing吗? [是/否]
没有
什么是你的类前缀?
XMG
在新库上运行pod安装。
你需要给path。 至less你应该从当前目录中提供path。 这将工作肯定。 。/文件名