ข้อผิดพลาด 'ต้องการ' Ruby: ไม่สามารถโหลดไฟล์ดังกล่าว


169

ฉันมีหนึ่งไฟล์ 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ทุกอย่างทำงานได้ดี ปัญหาอาจจะอยู่ที่นี่?


คำถามที่เกี่ยวข้อง: stackoverflow.com/questions/2900370/…
Andrew Grimm

ตรวจสอบว่าไฟล์มี.rbส่วนขยาย
onmyway133

คำตอบ:


189

ฉันแค่ลองและใช้งานrequire "./tokenizer"ได้ หวังว่านี่จะช่วยได้


15
นี่ถือว่า CWD เป็นไดเรกทอรีที่เก็บสคริปต์ไว้
David Grayson

25
... นั่นเป็นสาเหตุที่ฉันคิดว่ามันจะดีกว่าที่จะใช้require_relativeอย่างที่ฉันทำในคำตอบ
David Grayson

180

แค่ทำสิ่งนี้:

require_relative 'tokenizer'

หากคุณวางสิ่งนี้ลงในไฟล์ Ruby ที่อยู่ในไดเรกทอรีเดียวกันtokenizer.rbมันจะทำงานได้ดีไม่ว่าไดเรกทอรีทำงานปัจจุบันของคุณคืออะไร

คำอธิบายว่าทำไมจึงเป็นวิธีที่ดีที่สุด

คำตอบอื่น ๆ อ้างว่าคุณควรใช้require './tokenizer'แต่นั่นเป็นคำตอบที่ผิดเพราะมันจะใช้ได้เฉพาะเมื่อคุณรันกระบวนการ Ruby ของคุณในไดเรกทอรีเดียวกันกับที่tokenizer.rbในนั้นค่อนข้างมากเหตุผลเดียวที่คุณควรพิจารณาใช้requireเช่นนั้นคือถ้าคุณต้องการ สนับสนุน Ruby 1.8 ซึ่งไม่มีrequire_relativeอยู่

require './tokenizer'คำตอบอาจทำงานสำหรับคุณในวันนี้ แต่มันไม่จำเป็น จำกัด วิธีการที่คุณสามารถเรียกใช้รหัสทับทิมของคุณ พรุ่งนี้ถ้าคุณต้องการย้ายไฟล์ของคุณไปยังไดเรกทอรีอื่นหรือเพียงแค่ต้องการเริ่มต้นกระบวนการ Ruby ของคุณจากไดเรกทอรีอื่นคุณจะต้องคิดทบทวนrequireคำสั่งเหล่านั้นใหม่

การใช้requireเพื่อเข้าถึงไฟล์ที่อยู่บนพา ธ การโหลดเป็นสิ่งที่ดีและ Ruby gems ทำตลอดเวลา แต่คุณไม่ควรเริ่มโต้แย้งrequireด้วย.ถ้าคุณกำลังทำสิ่งที่พิเศษมากและรู้ว่าคุณกำลังทำอะไรอยู่

เมื่อคุณเขียนโค้ดที่ทำให้สมมติฐานเกี่ยวกับสภาพแวดล้อมของมันคุณควรคิดอย่างรอบคอบเกี่ยวกับสมมติฐานที่จะทำ ในกรณีนี้มีวิธีที่แตกต่างกันถึงสามวิธีในการเรียกใช้tokenizerไฟล์และแต่ละวิธีมีข้อสมมติที่แตกต่างกัน:

  1. require_relative 'path/to/tokenizer': สมมติว่าเส้นทางสัมพัทธ์ระหว่างสองไฟล์ต้นฉบับของ Ruby จะยังคงเหมือนเดิม
  2. require 'path/to/tokenizer': ถือว่าpath/to/tokenizerอยู่ในไดเรกทอรีใดไดเรกทอรีหนึ่งบนโหลดพา ธ ( $LOAD_PATH) โดยทั่วไปต้องใช้การตั้งค่าเพิ่มเติมเนื่องจากคุณต้องเพิ่มบางสิ่งลงในโหลดพา ธ
  3. require './path/to/tokenizer': สมมติว่าเส้นทางสัมพัทธ์จากไดเร็กทอรีการทำงานปัจจุบันของกระบวนการ Ruby tokenizer.rbกำลังจะยังคงเหมือนเดิม

ฉันคิดว่าสำหรับคนส่วนใหญ่และสถานการณ์ส่วนใหญ่สมมติฐานที่ทำในตัวเลือก # 1 และ # 2 มีแนวโน้มที่จะถือเป็นจริงเมื่อเวลาผ่านไป


คุณช่วยบอกได้ไหมว่าความหมายของสิ่งนี้คืออะไร? มันทำอะไรอยู่เบื้องหลัง ขอบคุณ
sid smith

ไม่มีอะไรให้รู้มากมาย นี่คือเอกสารประกอบและซอร์สโค้ดสำหรับ require_relative
David Grayson

90

Ruby 1.9 ได้ลบไดเรกทอรีปัจจุบันออกจากโหลดพา ธ ดังนั้นคุณจะต้องทำสิ่งที่จำเป็นสำหรับไฟล์นี้ตามที่ David Grayson กล่าวไว้:

require_relative 'tokenizer'

ไม่จำเป็นต้องต่อท้ายด้วย.rbเพราะรูบี้ฉลาดพอที่จะรู้ว่านั่นคือสิ่งที่คุณหมายถึงอยู่ดี


1
ฉันรู้ว่าสิ่งนี้จะเป็นเรื่องงี่เง่าขอบคุณสำหรับความช่วยเหลือ
The Coding Monk

3
นี่ถือว่า CWD เป็นไดเรกทอรีที่เก็บสคริปต์ไว้
David Grayson

@RyanBigg - ฉันใหม่กับทับทิม คุณช่วยอธิบายความหมายของมันได้Ruby 1.9 has removed the current directory from the load pathไหม- ไดเรกทอรีปัจจุบันและเส้นทางการโหลดคืออะไร? ขอบคุณ
sid smith

ฉันควรอ่านอะไรใน OP เพียงเพราะ OP ที่เกิดขึ้นจะมี CWD require_relativeเท่ากับไดเรกทอรีที่มีสคริปต์ไม่ได้หมายความว่ามันมักจะเป็นวิธีการที่ดังนั้นผมชอบที่จะผลักดันให้มีการแก้ปัญหาที่มีประสิทธิภาพมากขึ้นเช่นการใช้ พรุ่งนี้เขาอาจพิมพ์cd ..แล้วruby folder/main.rbเศร้าวิธีแก้ปัญหาของคุณไม่ทำงานอีกต่อไป ฉันไม่คิดว่าการใช้requireมีประโยชน์ใด ๆ ที่นี่
David Grayson

1
อัปเดตสำหรับrequire_relative(ซึ่งไม่มีอยู่หรือฉันไม่รู้เกี่ยวกับมันในขณะที่ทำการโพสต์)
Ryan Bigg

37

require$LOAD_PATHโหลดไฟล์เสียง หากคุณต้องการที่จะต้องใช้ไฟล์เทียบกับไฟล์ในขณะนี้การดำเนินการแทนจากการใช้งาน$LOAD_PATHrequire_relative


14

ฉันจะแนะนำ,

load './tokenizer.rb'

ระบุว่าคุณรู้ว่าไฟล์อยู่ในไดเรกทอรีทำงานเดียวกัน

หากคุณต้องการให้มันสัมพันธ์กับไฟล์คุณสามารถใช้

require_relative 'tokenizer'

ฉันหวังว่านี่จะช่วยได้.


11

อีกวิธีที่ดีเล็กน้อยคือการรวมไดเรกทอรีปัจจุบันในเส้นทางการโหลดของคุณด้วย

$:.unshift('.')

คุณสามารถผลักมันลงในอาร์เรย์ $: ($ LOAD_PATH) แต่ unshift จะบังคับให้โหลดไดเรกทอรีการทำงานปัจจุบันของคุณก่อนส่วนที่เหลือของเส้นทางการโหลด

เมื่อคุณเพิ่มไดเรกทอรีปัจจุบันในเส้นทางโหลดของคุณคุณไม่จำเป็นต้องระบุต่อไป

 require './tokenizer' 

และสามารถกลับไปใช้งานได้

require 'tokenizer'


1

ฉันใช้ jruby-1.7.4 เพื่อรวบรวมรหัสทับทิมของฉัน

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' 

มันใช้งานได้ดี


1

สำหรับผู้ที่แน่ใจว่าเส้นทางสัมพัทธ์ของพวกเขาถูกต้องปัญหาของฉันคือไฟล์ของฉันไม่มี.rbส่วนขยาย! (แม้ว่าฉันเคยRubyMineสร้างไฟล์และเลือกว่าเป็นRubyไฟล์ที่สร้าง)

ตรวจสอบนามสกุลไฟล์ในไฟล์ของคุณอีกครั้ง!



0

ปัญหาคือ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>'

ตามที่สามารถเห็นได้อ่านไฟล์ ok แต่ฉันไม่ต้องการมัน (เส้นทางไม่ได้รับการยอมรับ) และนี่คือรหัสที่ใช้งานได้:

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

อย่างที่คุณเห็นถ้าคุณระบุพา ธ เต็มไฟล์จะโหลดอย่างถูกต้อง


1
มันเป็นเรื่องของการเลือก ฉันมักจะชอบทดสอบสิ่งที่ฉันทำในคอนโซลแบบโต้ตอบเสมอ ฉันทำผิดพลาดค่อนข้างมากและฉันชอบรับข้อเสนอแนะแบบโต้ตอบ
Boris Strandjev

0

ครั้งแรก:

$ sudo gem install colored2

และคุณควรใส่รหัสผ่านของคุณ

จากนั้น:

$ sudo gem update --system  

ปรากฏกำลังอัปเดต rubygems-update ข้อผิดพลาด: ขณะดำเนินการ gem ... (OpenSSL :: SSL :: SSLError) ชื่อโฮสต์ "gems.ruby-china.org" ไม่ตรงกับใบรับรองเซิร์ฟเวอร์

แล้ว:

$  rvm -v
$ rvm get head

สุดท้ายคุณต้องการใช้ภาษาใด ?? [Swift / ObjC]

ObjC

คุณต้องการรวมแอพพลิเคชั่นตัวอย่างเข้ากับห้องสมุดของคุณหรือไม่? [ ใช่ไม่ใช่ ]

ใช่

คุณจะใช้กรอบการทดสอบแบบใด [Specta / Kiwi / ไม่มี]

ไม่มี

คุณต้องการที่จะดูการทดสอบตาม? [ ใช่ไม่ใช่ ]

ไม่

คำนำหน้าชั้นเรียนของคุณคืออะไร?

XMG

การเรียกใช้พ็อดติดตั้งในห้องสมุดใหม่ของคุณ


-2

คุณต้องให้เส้นทาง อย่างน้อยคุณควรให้เส้นทางจากไดเรกทอรีปัจจุบัน มันจะทำงานได้อย่างแน่นอน ./ชื่อไฟล์


เพื่อความชัดเจนฉันคิดว่าคุณควรให้รหัสซ้ำกับส่วนแก้ไขที่นี่ การลงคะแนนเสียงไม่ใช่ของฉัน
Rohit Gupta
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.