Ruby 'gerektirir' hatası: böyle bir dosya yüklenemiyor


169

Aşağıdaki içeriğe sahip bir dosya, main.rb var:

require "tokenizer.rb"

Tokenizer.rb dosyası aynı dizinde ve içeriği:

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

Main.rb çalıştırmayı denerseniz aşağıdaki hatayı alıyorum:

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>'

Sadece farkettim ki herşey loadyerine kullanırsam requireişe yarıyor. Sorun burada ne olabilir?



Dosyanın .rbuzantıya sahip olup olmadığını kontrol edin
onmyway133

Yanıtlar:


189

Sadece denedim ve işe yarıyor require "./tokenizer". Bu yardımcı olur umarım.


15
Bu, CWD'nin komut dosyalarının depolandığı dizin olduğunu varsayar.
David Grayson

25
... bu yüzden cevabımda yaptığım require_relativegibi kullanmanın daha iyi olduğunu düşünüyorum .
David Grayson

180

Sadece bunu yap:

require_relative 'tokenizer'

Bunu, aynı dizinde bulunan bir Ruby dosyasına koyarsanız tokenizer.rb, geçerli çalışma dizininiz (CWD) ne olursa olsun iyi çalışır.

Bunun neden en iyi yol olduğunu açıklama

Diğer cevaplar kullanmalısınız iddia require './tokenizer'ama yani yanlış size aynı dizinde sizin Yakut süreci sadece iş çalışacak çünkü eğer, cevap tokenizer.rbiçindedir. Hemen hemen tek nedeni kullanmayı düşünün requireeğer gerekiyorsa olacağını böyle Desteklenmeyen Ruby 1.8'i destekleyin require_relative.

require './tokenizer'Cevap Bugün senin için işe yarayabilecek ama gereksiz yere size Yakut kod çalıştırabilir yolları sınırlar. Yarın, dosyalarınızı farklı bir dizine taşımak veya yalnızca Ruby işleminizi farklı bir dizinden başlatmak istiyorsanız, tüm bu requireifadeleri yeniden düşünmeniz gerekir .

requireYükleme yolundaki dosyalara erişmek için kullanmak iyi bir şeydir ve Ruby gems her zaman bunu yapar. Ancak, çok özel bir şey yapmadıkça ve ne yaptığınızı bilmiyorsanız , tartışmayı bir requireile başlamamalısınız ..

Çevresi hakkında varsayımlarda bulunan bir kod yazarken, hangi varsayımlarda bulunacağınızı dikkatlice düşünmelisiniz. Bu durumda, tokenizerdosyayı istemek için üç farklı yol vardır ve her biri farklı bir varsayım yapar:

  1. require_relative 'path/to/tokenizer': İki Ruby kaynak dosyası arasındaki göreceli yolun aynı kalacağını varsayar.
  2. require 'path/to/tokenizer': path/to/tokenizerYükleme yolundaki ( $LOAD_PATH) dizinlerden birinin içinde olduğunu varsayar . Bu, yükleme yoluna bir şeyler eklemeniz gerektiğinden, genellikle ek kurulum gerektirir.
  3. require './path/to/tokenizer': Ruby işleminin geçerli çalışma dizininden göreli yolun tokenizer.rbaynı kalacağını varsayar .

Çoğu insan ve çoğu durumda, # 1 ve # 2 seçeneklerinde yapılan varsayımların zaman içinde geçerli olma ihtimalinin daha yüksek olduğunu düşünüyorum.


Bunun anlamının ne olduğunu söyleyebilir misiniz? Perde arkasında ne yapar? Teşekkürler.
sid smith

Bilmeniz gereken çok şey yok. İşte belgeler ve kaynak kodu require_relative için.
David Grayson

90

Ruby 1.9 geçerli dizini yükleme yolundan sildi ve bu nedenle David Grayson'ın dediği gibi bu dosyada göreceli bir gereksinim yapmanız gerekecek:

require_relative 'tokenizer'

.rbRuby'nin zaten ne demek istediğini anlayacak kadar zeki olduğu için eklemeye gerek yok .


1
Bunun aptalca bir şey olacağını biliyordum, yardım için teşekkürler
Coding Monk

3
Bu, CWD'nin komut dosyalarının depolandığı dizin olduğunu varsayar.
David Grayson

@RyanBigg - Ruby'de yeniyim. Bunun ne anlama geldiğini açıklayabilir misiniz - Ruby 1.9 has removed the current directory from the load path? Bu geçerli dizin ve yükleme yolu nedir? Teşekkürler.
sid smith

OP'de ne okumam gerekiyor? OP'nin CWD'nin komut dosyalarına sahip dizine eşit olması her zaman bu şekilde olacağı anlamına gelmez, bu yüzden kullanmak gibi daha sağlam bir çözüm için itmeyi seviyorum require_relative. Yarın yazıp cd ..sonra ruby folder/main.rbüzgün olabilir ve çözümünüz artık çalışmıyor. requireBurada kullanmanın herhangi bir faydası olduğunu düşünmüyorum .
David Grayson

1
İçin güncelleme require_relative(mevcut değildi, ya da ben bunu yayınlama sırasında, bilmiyordum)
Ryan Bigg

37

requiredosyasından bir dosya yükler $LOAD_PATH. Şu anda yürütülen dosyaya göre yerine bir dosya istemek istiyorsanız $LOAD_PATHkullanın require_relative.


14

Ben tavsiye ederim,

load './tokenizer.rb'

Verilen, dosyanın aynı çalışma dizininde olduğunu bildiğiniz.

Dosyaya göre zorunlu tutmaya çalışıyorsanız,

require_relative 'tokenizer'

Umarım bu yardımcı olur.


11

Başka bir güzel küçük yöntem, geçerli dizini yükleme yolunuza dahil etmektir

$:.unshift('.')

Diziyi $: ($ LOAD_PATH) dizisine itebilirsiniz, ancak unshift, geçerli çalışma dizininizi yükleme yolunun geri kalanından önce yüklemeye zorlar.

Mevcut dizininizi yükleme yolunuza ekledikten sonra, belirtmeye devam etmenize gerek yoktur

 require './tokenizer' 

ve kullanmaya geri dönebilir

require 'tokenizer'

5

Bir gem lib dizininde ise ve bu tokenizer.rb ise güzel bir şekilde çalışır.

require_relative 'tokenizer/main'

1

Yakut kodumu derlemek için jruby-1.7.4 kullandım.

require 'roman-numerals.rb' 

aşağıdaki hatayı atan koddur.

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

Ben rb gerektiren kaldırmak ve verdi

require 'roman-numerals' 

İyi çalıştı.


1

Göreceli yollarının doğru olduğundan kesinlikle emin olanlar için sorunum dosyalarımın .rbuzantısına sahip olmamasıydı ! (Her ne RubyMinekadar Rubydosyaları oluşturup eskiden dosya oluşturulduğunu seçsem de.)

Dosyanızdaki dosya uzantılarını bir kez daha kontrol edin!



0

Sorun, requiregeçerli dizinden yüklenmemesidir. Ben de öyle düşündüm ama sonra bu konuyu buldum . Örneğin, aşağıdaki kodu denedim:

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>'

Görülebileceği gibi ok dosyasını okuyorum, ama bunu gerektiremedim (yol tanınmadı). ve işte çalışan kod:

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

Gördüğünüz gibi tam yolu belirtip belirtmediğiniz dosya düzgün yükleniyor.


1
Bu bir tercih meselesi. Ben şahsen etkileşimli konsolda ne yaptığımı test etmek isterim. Çok fazla hata yapıyorum ve etkileşimli geri bildirim almayı seviyorum.
Boris Strandjev

0

İlk :

$ sudo gem install colored2

Ve şifrenizi girmelisiniz

Sonra :

$ sudo gem update --system  

Görünüyor Güncelleme rubygems-update HATA: Gem yürütülürken ... (OpenSSL :: SSL :: SSLError) ana bilgisayar adı "gems.ruby-china.org" sunucu sertifikasıyla eşleşmiyor

Sonra:

$  rvm -v
$ rvm get head

Son Hangi dili kullanmak istiyorsunuz ?? [Swift / ObjC]

objc

Kütüphanenize bir demo uygulaması eklemek ister misiniz? [ Evet Hayır ]

Evet

Hangi test çerçevelerini kullanacaksınız? [Specta / Kivi / Yok]

Yok

Görünüme dayalı test yapmak ister misiniz? [ Evet Hayır ]

Hayır

Sınıf ön ekiniz nedir?

XMG

Yeni kitaplığınızda bölme yüklemesini çalıştırma.


-2

yolu vermelisin. En azından geçerli dizinden yol vermelisiniz. Kesinlikle işe yarayacak. ./dosya adı


Açıklık için, kodun tekrarlanan kısmını düzeltmeyle birlikte vermeniz gerektiğini düşünüyorum. Aşağı oylama benim değil
Rohit Gupta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.