복붙노트

[RUBY-ON-RAILS] 어떻게 부하는 루비에 필요 다릅니 까?

RUBY-ON-RAILS

어떻게 부하는 루비에 필요 다릅니 까?

루비 온 레일즈 애플리케이션에서 필요로하고 부하 사이에 큰 차이가 있나요? 아니면 둘 다 동일한 기능을해야합니까?

해결법

  1. ==============================

    1.모두에 정의 된 검색 경로도 추가를 라이브러리에 대한 검색이 필요 .rb 또는 .so를 입력 한 파일 이름. 또한 라이브러리는 것을 확인합니다 한 번 포함되어 있습니다. 이 경우 응용 프로그램이 라이브러리을 필요로하고 B 및 라이브러리 B의 (GPT)를 사용하여 라이브러리 A는 너무 한 번만로드 될 것입니다.

    모두에 정의 된 검색 경로도 추가를 라이브러리에 대한 검색이 필요 .rb 또는 .so를 입력 한 파일 이름. 또한 라이브러리는 것을 확인합니다 한 번 포함되어 있습니다. 이 경우 응용 프로그램이 라이브러리을 필요로하고 B 및 라이브러리 B의 (GPT)를 사용하여 라이브러리 A는 너무 한 번만로드 될 것입니다.

    부하 사용하면 라이브러리의 전체 이름을 추가 할 필요가 때마다 당신을로드되는 부하를 호출 - 이미 메모리에있는 경우에도 마찬가지입니다.

  2. ==============================

    2.커널 # 사이의 또 다른 차이점은 필요로하고 커널 # 부하는 커널 # 부하가 익명 빈 모듈에로드 된 코드를 포장 할 수있는 옵션은 2 개의 인자를 가지고 있다는 것입니다.

    커널 # 사이의 또 다른 차이점은 필요로하고 커널 # 부하는 커널 # 부하가 익명 빈 모듈에로드 된 코드를 포장 할 수있는 옵션은 2 개의 인자를 가지고 있다는 것입니다.

    불행하게도, 그것은 매우 유용하지 않습니다. 로드 된 코드는 단지 즉, 그들은 여전히 ​​클래스 같은 것을 monkeypatch 수 있습니다 : 문자열, 글로벌 네임 스페이스에 액세스하여, 모듈의 탈옥을 위해 첫째, 쉽게; 데프 foo는; 끝을 종료합니다. 당신은 기본적으로 손으로 오브젝트 공간 :: each_object (모듈)의 그것을 밖으로 물고기 그래서 둘째, 부하, 그것은에 코드를 래핑 모듈을 반환하지 않습니다.

  3. ==============================

    3.나는 레일 응용 프로그램을 실행하고 Gemfile에, 나는이 옵션으로 작성된 특정 사용자 정의 보석을했다 "필요합니다 거짓". 나는 레일 서버를로드 또는 콘솔 레일 때 지금, 나는이 초기화의 보석을 필요로 할 수 있었고, 보석로드되었다. 내가 RSpec에와 카피 바라와 사양 기능 테스트를 실행했을 때 그러나, 나는로드 오류가 발생했습니다. 테스트를 실행할 때 보석이 $ LOAD_PATH에서 찾을 수 없습니다 왜 나는 완전히 당황했다.

    나는 레일 응용 프로그램을 실행하고 Gemfile에, 나는이 옵션으로 작성된 특정 사용자 정의 보석을했다 "필요합니다 거짓". 나는 레일 서버를로드 또는 콘솔 레일 때 지금, 나는이 초기화의 보석을 필요로 할 수 있었고, 보석로드되었다. 내가 RSpec에와 카피 바라와 사양 기능 테스트를 실행했을 때 그러나, 나는로드 오류가 발생했습니다. 테스트를 실행할 때 보석이 $ LOAD_PATH에서 찾을 수 없습니다 왜 나는 완전히 당황했다.

    나는 모든 다른 부하가 요구하는 방법, 젬과 들러 상호 작용을 검토 그래서. 그리고 이들은 내 특정 문제에 대한 해결책을 발견하는 데 도움 내 연구 결과의 요약이다 :

    하중

    1) 루비 파일 그것을 절대 경로를 통과 할 수 있고 그 파일 내의 코드를 실행한다.

    load('/Users/myuser/foo.rb')
    

    2) 당신은 부하에 상대 경로를 전달할 수 있습니다. 당신이 파일과 같은 디렉토리에있는 경우, 그것은 그것을 발견 할 것이다 :

    > load('./foo.rb')
    foo.rb loaded!
    => true
    

    당신이 부하 ()와 다른 디렉토리에서 파일을로드하려고하면, 그것은 (예를 들어 ./) 현재 작업 디렉토리에 따라 상대 경로를 찾을 수 없습니다 :

    > load('./foo.rb')
    LoadError: cannot load such file -- foo.rb
    

    위와 같이 3), 부하는 항상 (파일을로드 할 수없는 경우가 LoadError를 제기) true를 돌려줍니다.

    4) 글로벌 변수, 클래스, 상수 및 방법은 모든 지역 변수 가져 왔지만되지 않습니다.

    5) 동일한 파일에 두 번로드를 호출하면 두 배 파일의 코드를 실행합니다. 지정된 파일이 상수를 정의하는 경우 경고를 생성하는 두 배 상수를 정의합니다.

    6) $ LOAD_PATH 절대 경로의 배열이다. 당신은 부하에게 단지 파일 이름을 전달하는 경우, 그것은 것입니다 $ LOAD_PATH을 반복하고 각 디렉토리에있는 파일을 검색합니다.

    > $LOAD_PATH.push("/Users/myuser")
    > load('foo.rb')
    foo.rb loaded!
     => true
    

    필요

    1) 두 번 한 번만 실행됩니다 같은 파일이 필요합니다 호출. 그것은 또한 당신이 절대 경로와 상대 경로로 일단 한 번이를 참조하면 두 번 같은 파일을로드하지 스마트 충분하다.

    이 아니었다면 파일이 실행되고 잘못된 경우 2)가 true를 반환해야합니다.

    3) 필요 파일이 글로벌 변수 $ LOADED_FEATURES에 이미로드되어있는 추적합니다.

    4) 당신은 파일 확장자를 포함 할 필요가 없습니다 :

    require 'foo'
    

    5) foo.so, foo.o, 또는 foo.dll를 같은뿐만 아니라 동적 라이브러리 파일, foo.rb를 찾습니다 필요합니다. 이것은 당신이 루비에서 C 코드를 호출 할 수있는 방법입니다.

    현재 디렉토리가 $ LOAD_PATH하지 기본적으로 이후 6), 현재 디렉토리를 확인하지 않습니다 필요합니다.

    7) require_relative는 현재 파일이 아닌 프로세스의 작업 디렉토리의 상대 경로를합니다.

    1) 젬 쉽게 보석이라고 루비 라이브러리의 설치를 관리하기 위해 설계된 패키지 관리자입니다.

    2) 일부 메타 데이터와 함께, 당신의 코드로 가져올 수 있습니다 루비 파일 및 / 또는 동적 라이브러리 파일들을 포함하는 zip 파일로 내용을 패키지.

    3) 젬은 기본 자체 버전과 방법을 필요로 대체합니다. 그 버전은 $ LOAD_PATH에있는 디렉토리에 추가로 설치된 보석을 통해 볼 것이다. 젬이 당신의 보석에서 파일을 발견하면, 그것은 당신의 $의 LOAD_PATH에 그 보석을 추가합니다.

    4) 보석은 보석 및 설치 수 그들의 모든 종속성에서 명령 수치를 설치합니다. 이 보석 자체를 설치하기 전에 사실, 보석의 모든 종속성을 설치합니다.

    들러

    1) Bundler를 사용하면 모든 보석을 프로젝트 요구하고 선택적으로 무엇을 그 보석의 버전을 지정할 수 있습니다. 그리고 번들 명령은 모든 보석과 종속성을 설치합니다.

    2) 당신은 당신이 Gemfile라는 파일에 필요로하는 보석 지정합니다.

    3) 번들 명령은 나열된 특정 버전에 Gemfile.lock에 나열된 모든 보석을 설치합니다.

    4) 예를 들어, 전 명령 번들 간부 퍼팅 , 간부 RSpec에 당신의 Gemfile.lock에 지정된 보석의 버전을로드 할 필요 보장하지만 번들.

    레일 및 Bundler를

    1) 설정 / boot.rb에서 '들러 / 설치'를 필요로하는 실행됩니다. 들러는 루비 (종속의 모든)에 Gemfile의 보석을 모두 찾을 수 있는지 확인합니다. 당신의 Gemfile을 자동으로 발견합니다 '들러 / 설치'를 요구하고, 루비 사용할 수 귀하의 Gemfile에있는 보석의 모든을 (기술 측면에서, 그것은 "부하 경로의"보석을 넣습니다). 당신은 '젬'을 요구하는 몇 가지 추가 권한을 추가하는로 생각할 수 있습니다.

    ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
    require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
    

    2) 이제 코드는 루비를 사용할 수 있도록, 당신은 당신이 필요로하는 보석을 요구할 수 있습니다. 예를 들어, '시나'를 요구할 수 있습니다. 당신은 의존성이 많이있는 경우에, 당신은 "내 Gemfile에 보석의 모든 요구 '라고 할 수 있습니다. 이렇게하려면, 바로 '들러 / 설치'를 요구하는 다음 다음 코드를 넣어 :

    Bundler.require(:default)
    

    3) 기본적으로 호출 Bundler.require는 Gemfile의 각 보석이 필요합니다. 다음은 확인 foo에 설치되어 있는지 확인합니다,하지만 필요한 호출하지 않습니다 => 거짓을 필요로 다음 Gemfile의 라인은 보석 '푸'라고합니다. 당신은 당신이 보석을 사용하려는 경우 ( 'foo는')를 필요로 전화해야합니다.

    그래서 지식의 폭을 주어, 나는 Bundler.setup은 $ LOAD_PATH에 추가 만이 필요하기 때문에 내가 명시 적으로 rails_helper.rb의 보석을 필요로했다 내 테스트의 문제로 돌아와 실현 : 거짓 명시 적으로 요구에서 Bundler.require을 배제 . 그리고 문제가 해결되었다.

  4. from https://stackoverflow.com/questions/3170638/how-does-load-differ-from-require-in-ruby by cc-by-sa and MIT license