programing

Ruby 'require' 오류: 해당 파일을 로드할 수 없습니다.

goodsources 2023. 5. 31. 15:52
반응형

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모든 것이 잘 작동합니다.여기에 무슨 문제가 있습니까?

방금 시도해봤는데, 작동합니다.require "./tokenizer".

이렇게 하면 됩니다.

require_relative 'tokenizer'

만약 당신이 이것을 같은 디렉토리에 있는 Ruby 파일에 넣는다면.tokenizer.rb현재 작업 디렉터리(CWD)가 무엇이든 상관없이 잘 작동합니다.

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

다른 답변은 사용해야 한다고 주장합니다.require './tokenizer'하지만 그것은 잘못된 답입니다. 왜냐하면 그것은 당신이 루비 프로세스를 같은 디렉토리에서 실행할 때만 작동하기 때문입니다.tokenizer.rb안에 있어요 거의 유일한 이유는requireRuby 1.8을 지원해야 하는 경우와 마찬가지로, Ruby 1.8은 지원하지 않습니다.require_relative.

require './tokenizer'답변은 오늘날 당신에게 효과가 있을지 모르지만, 그것은 당신이 루비 코드를 실행하는 방법을 불필요하게 제한합니다.내일, 당신이 당신의 파일을 다른 디렉토리로 옮기거나 다른 디렉토리에서 루비 프로세스를 시작하고 싶다면, 당신은 그것들 모두를 다시 생각해야 할 것입니다.require진술들.

사용.require로드 경로에 있는 파일에 액세스하는 것은 좋은 일이며 Ruby gems는 항상 그렇게 합니다.하지만 당신은 논쟁을 시작해서는 안됩니다.require와 함께.당신이 매우 특별한 것을 하고 있고 당신이 무엇을 하고 있는지 아는 것이 아니라면.

환경에 대한 가정을 하는 코드를 작성할 때는 어떤 가정을 해야 할지 신중하게 생각해야 합니다.이 경우, 최대 3가지 방법이 있습니다.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의 가정은 시간이 지남에 따라 사실로 유지될 가능성이 더 높다고 생각합니다.

Ruby 1.9는 로드 경로에서 현재 디렉터리를 제거했으므로 David Grayson이 말하는 것처럼 이 파일에 대해 상대적인 요구 사항을 수행해야 합니다.

require_relative 'tokenizer'

접미사를 붙일 필요가 없습니다..rb루비가 똑똑하기 때문에 그게 네 말인 걸 알 수 있을 거야 어쨌든.

require합니다.$LOAD_PATH에서가 아니라 현재 실행 중인 파일과 관련된 파일이 필요한 경우$LOAD_PATH,사용하다require_relative.

저는 추천합니다.

load './tokenizer.rb'

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

파일과 관련하여 필요한 경우 다음을 사용할 수 있습니다.

require_relative 'tokenizer'

이것이 도움이 되길 바랍니다.

다른 좋은 작은 방법은 로드 경로에 현재 디렉터리를 포함하는 것입니다.

$:.unshift('.')

$: ($LOAD_PATH) 배열에 푸시할 수 있지만, 시프트를 해제하면 로드 경로의 나머지 부분보다 먼저 현재 작업 디렉터리가 로드됩니다.

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

 require './tokenizer' 

다시 사용할 수 있습니다.

require 'tokenizer'

이것은 그것이 gemlib 디렉토리에 있고 이것이 tokenizer.rb라면 잘 작동할 것입니다.

require_relative 'tokenizer/main'

으로 확신하는 , 제는 제 에 상대경정절확사로게신에람들제는, ▁the▁did▁have▁not▁for이▁my파▁that▁files일제▁was▁my▁problem▁is상▁who▁path제▁absolute,▁are대가 없다는 것이었습니다..rb (▁(!▁used비▁i!!)RubyMine이 파일로 되었습니다.Ruby생성 시 파일.)

파일 확장명을 다시 확인합니다!

검색 경로에 현재 디렉터리를 포함하는 것은 어떻습니까?

ruby -I. main.rb

루비 코드를 컴파일하기 위해 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

나는 require에서 rb를 제거하고 주었습니다.

require 'roman-numerals' 

잘 작동했습니다.

는 문는입니다.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>'

보이는 대로 파일을 읽었지만, 저는 그것을 요구할 수 없었습니다(경로가 인식되지 않았습니다).작동하는 코드는 다음과 같습니다.

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

전체 경로를 지정하면 파일이 올바르게 로드됩니다.

첫 번째:

$ 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

라이브러리에 데모 응용 프로그램을 포함하시겠습니까?[ 예 / 아니오 ]

네.

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

없음.

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

아니요.

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

XMG

새 라이브러리에서 포드 설치를 실행하고 있습니다.

당신은 길을 주어야 합니다.적어도 현재 디렉터리에서 경로를 지정해야 합니다.확실히 작동할 것입니다. ./filename

언급URL : https://stackoverflow.com/questions/9750610/ruby-require-error-cannot-load-such-file

반응형