루비 '필수'오류 : 해당 파일을로드 할 수 없습니다


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정상적으로 작동 한다는 것을 알았습니다 . 여기에 무슨 문제가 있습니까?



파일의 .rb확장자를 확인하십시오
onmyway133

답변:


189

방금 시도했지만 작동합니다 require "./tokenizer". 도움이 되었기를 바랍니다.


15
이것은 CWD가 스크립트가 저장된 디렉토리라고 가정합니다.
David Grayson

25
그렇기 때문에 require_relative대답에서했던 것처럼 사용하는 것이 낫다고 생각합니다 .
David Grayson

180

그냥 이렇게 :

require_relative 'tokenizer'

이 파일을와 같은 디렉토리에있는 Ruby 파일에 넣으면 tokenizer.rb현재 작업 디렉토리 (CWD)가 무엇이든 상관없이 제대로 작동합니다.

이것이 최선의 방법 인 이유에 대한 설명

다른 답변은 사용해야한다고 주장 require './tokenizer'하지만 잘못된 답변입니다. 루비 프로세스를 동일한 디렉토리에서 실행하는 경우에만 작동하기 때문에 그렇게 해야하는 tokenizer.rb이유는 거의 require필요합니다. 가없는 Ruby 1.8을 지원합니다 require_relative.

require './tokenizer'대답은 오늘 당신을 위해 작동 할 수 있지만, 불필요하게 당신이 당신의 루비 코드를 실행할 수있는 방법을 제한합니다. 내일, 파일을 다른 디렉토리로 옮기거나 다른 디렉토리에서 Ruby 프로세스를 시작하려면 해당 require문장을 모두 다시 생각해야 합니다.

사용 require하중 경로에있는 파일에 액세스하는 것은 좋은 일이고 루비 보석 모든 시간을. 하지만 당신은에 인수를 시작해서는 안 requireA를 .아주 특별한 경우가 아니면 일을 뭔가 당신이 무엇을하고 있는지 알고있다.

환경에 대해 가정하는 코드를 작성할 때는 어떤 가정을 고려해야하는지 신중하게 고려해야합니다. 이 경우 tokenizer파일 을 요구하는 최대 3 가지 방법이 있으며 각각 다른 가정을합니다.

  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
도움을 주셔서 감사합니다.
코딩 스님

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(게시물의 시간에 존재하지 않았다, 또는 그것에 대해 알지 못했다)
라이언 Bigg

37

require에서 파일을로드합니다 $LOAD_PATH. 에서 대신 현재 실행중인 파일을 기준으로 파일을 요구하려면을 $LOAD_PATH사용하십시오 require_relative.


14

나는 추천 할 것이다

load './tokenizer.rb'

파일이 동일한 작업 디렉토리에 있음을 알고 있습니다.

파일을 기준으로 요구하려는 경우 사용할 수 있습니다.

require_relative 'tokenizer'

이게 도움이 되길 바란다.


11

또 다른 멋진 작은 방법은 현재 디렉토리를로드 경로에 포함시키는 것입니다.

$:.unshift('.')

$ : ($ LOAD_PATH) 배열로 푸시 할 수는 있지만 unshift는 나머지로드 경로 전에 현재 작업 디렉토리를 강제로로드합니다.

로드 경로에 현재 디렉토리를 추가 한 후에는 계속 지정할 필요가 없습니다.

 require './tokenizer' 

다시 사용으로 돌아갈 수 있습니다.

require 'tokenizer'

5

gem lib 디렉토리에 있고 tokenizer.rb 인 경우에 잘 작동합니다.

require_relative 'tokenizer/main'

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

마지막으로 어떤 언어를 사용 하시겠습니까? [스위프트 / ObjC]

ObjC

라이브러리에 데모 애플리케이션을 포함 하시겠습니까? [ 예 아니오 ]

어떤 테스트 프레임 워크를 사용 하시겠습니까? [스펙 타 / 키위 / 없음]

없음

뷰 기반 테스트를 하시겠습니까? [ 예 아니오 ]

아니

수업 접두사는 무엇입니까?

XMG

새 라이브러리에서 포드 설치 실행


-2

경로를 제시해야합니다. 현재 디렉토리에서 경로를 지정해야합니다. 확실히 작동합니다. ./파일 이름


명확히하기 위해 여기에 코드의 일부를 수정과 함께 반복해서 제공해야한다고 생각합니다. 아래 표는 광산하지 않습니다
로힛 굽타
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.