development

Ruby에서 require_relative와 require의 차이점은 무엇입니까?

big-blog 2020. 3. 16. 08:24
반응형

Ruby에서 require_relative와 require의 차이점은 무엇입니까?


루비 require_relative의 차이점은 무엇입니까 require?


문서를 살펴보십시오 .

require_relative명령문을 require포함하는 파일과 관련된 파일을로드 할 수 있도록 하여 내장 메소드 보완합니다 require_relative.

예를 들어, "test"디렉토리에 단위 테스트 클래스가 있고 테스트 "test / data"디렉토리 아래에 해당 클래스에 대한 데이터가있는 경우 테스트 케이스에서 다음과 같은 행을 사용할 수 있습니다.

require_relative "data/customer_data_1"

require_relative 편리한 하위 집합입니다 require

require_relative('path')

같음 :

require(File.expand_path('path', File.dirname(__FILE__)))

if __FILE__가 정의되어 있거나 LoadError그렇지 않으면 발생합니다.

이것은 다음을 의미합니다.

  • require_relative 'a'그리고 require_relative './a'받는 상대 필요로 현재 파일 ( __FILE__).

    결과는 호출자의 현재 디렉토리에 의존하지 않기 때문에 라이브러리 내부에서 필요할 때 사용하려는 것입니다.

  • eval('require_relative("a.rb")')인상 LoadError때문에 __FILE__내부에 정의되어 있지 않습니다 eval.

    이것이 바로 require_relativeRSpec 테스트에서 사용할 수없는 이유 eval입니다.

다음 작업 만 가능합니다 require:

  • require './a.rb'현재 디렉토리에 상대적인 요구

  • require 'a.rb'검색 경로 ( $LOAD_PATH)를 사용하여 필요합니다. 현재 디렉토리 또는 경로와 관련된 파일을 찾지 않습니다.

    require_relative문서에서 "파일 이름이 절대 경로로 해석되지 않는 경우"(예 : /또는 ./또는로 시작 ../하는 경우) 에만 경로 검색이 발생한다고 문서에서 말하고 있기 때문에 불가능 합니다 File.expand_path.

다음 작업은 둘 다 가능하지만 require짧고 효율적이므로 사용하고 싶을 것입니다.

  • require '/a.rb'require_relative '/a.rb'모두 절대 경로를 필요로한다.

소스 읽기

문서가 명확하지 않은 경우 소스를 살펴 보는 것이 좋습니다 (문서의 소스를 전환). 어떤 경우에는 무슨 일이 일어나고 있는지 이해하는 데 도움이됩니다.

필요합니다 :

VALUE rb_f_require(VALUE obj, VALUE fname) {
  return rb_require_safe(fname, rb_safe_level());
}

require_relative :

VALUE rb_f_require_relative(VALUE obj, VALUE fname) {
    VALUE base = rb_current_realfilepath();
    if (NIL_P(base)) {
        rb_loaderror("cannot infer basepath");
    }
    base = rb_file_dirname(base);
    return rb_require_safe(rb_file_absolute_path(fname, base), rb_safe_level());
}

이를 통해 우리는

require_relative('path')

와 같다:

require(File.expand_path('path', File.dirname(__FILE__)))

때문에:

rb_file_absolute_path   =~ File.expand_path
rb_file_dirname1        =~ File.dirname
rb_current_realfilepath =~ __FILE__

Ruby API에서 :

require_relative는 require_relative 문이 포함 된 파일과 관련된 파일을로드 할 수 있도록함으로써 내장 메소드 요구 사항을 보완합니다.

require를 사용하여 파일을로드 할 때 일반적으로 시스템에 올바르게 설치되어 액세스 가능한 기능에 액세스하는 것입니다. require는 프로젝트 코드 내에서 파일을로드하기위한 좋은 솔루션을 제공하지 않습니다. 이 기능은 개발 단계에서 테스트 데이터에 액세스하거나 외부에서 사용하지 않고 프로젝트 내부에서 "잠긴"파일에 액세스하는 데 유용 할 수 있습니다.

예를 들어, "test"디렉토리에 단위 테스트 클래스가 있고 테스트 "test / data"디렉토리 아래에 해당 클래스에 대한 데이터가있는 경우 테스트 케이스에서 다음과 같은 행을 사용할 수 있습니다.

require_relative "data/customer_data_1" 

"test"나 "test / data"가 Ruby의 라이브러리 경로에 있지 않을 가능성이 높기 때문에 일반적인 요구 사항으로는 찾지 못합니다. require_relative는이 특정 문제에 대한 좋은 솔루션입니다.

로드중인 파일의 확장자 (.rb 또는 .so)를 포함하거나 생략 할 수 있습니다.

경로는 to_str에 응답해야합니다.

http://extensions.rubyforge.org/rdoc/classes/Kernel.html 에서 설명서를 찾을 수 있습니다 .


요약

사용하여 require설치 보석에 대한

를 사용하여 require_relative로컬 파일에 대한

require를 사용하여 $LOAD_PATH파일을 찾습니다.
require_relative명령문을 사용하여 파일의 현재 위치를 사용합니다.


요구하다

요구 사항은 gem install [package]해당 기능을 위해 시스템 어딘가에 패키지 를 설치 (예 :)해야합니다.

사용하는 경우 require당신은 할 수 있습니다 "사용 ./현재 디렉토리, 예를 들어, 한 파일에 대해"형식을 require "./my_file"하지만 일반적인 또는 권장 방법이 아닙니다 당신은 사용해야합니다 require_relative대신.

require_relative

이것은 단순히 'require_relative 문으로 파일의 위치에 상대적인'파일을 포함한다는 것을 의미합니다. 나는 일반적으로 파일을 "up"과 반대로 현재 디렉토리 트리에 "내"있어야하는 것이 좋습니다. 예를 들어 사용 하지 마십시오

require_relative '../../../filename'

불필요하고 취약한 종속성을 생성하는 경향이 있기 때문에 파일 시스템 내에서 (최대 3 개의 디렉토리 레벨) 그러나 디렉토리 트리 내에서 이미 '깊게'있는 경우에는 다른 디렉토리 트리 분기가 "위로"아래로 필요할 수 있습니다. 더 간단하게 는이 저장소 외부의 파일에 require_relative를 사용하지 마십시오 (2018 년 말 현재이 시점에서 사실상 표준 인 git을 사용한다고 가정).

require_relative 문과 함께 파일require_relative 의 현재 디렉토리 사용하십시오 (따라서 명령을 사용하는 현재 디렉토리 일 필요는 없습니다). 이렇게하면 경로는 항상 같은 방식으로 필요한 파일에 상대적이므로 "안정적"으로 유지 됩니다.require_relative


정답은 정확하지만 매우 기술적 인 것입니다. 루비를 처음 접하는 사람들에게는

  • require_relative 작성한 다른 파일에서 코드를 가져 오는 데 가장 많이 사용됩니다.

예를 들어 데이터가 ~/my-project/data.rb있고 데이터 를 포함하려면 ~/my-project/solution.rb어떻게해야합니까? solution.rb당신을 추가합니다 require_relative 'data'.

이러한 파일이 동일한 디렉토리에있을 필요는 없습니다. require_relative '../../folder1/folder2/data'유효합니다.

  • require 다른 사람이 작성한 라이브러리에서 코드를 가져 오는 데 가장 많이 사용됩니다.

예를 들어 active_support라이브러리에 제공된 도우미 함수 중 하나를 사용하려면 어떻게해야 합니까? gem을 gem install activesupport파일 에 설치 한 다음 파일 에 설치해야 합니다 require 'active_support'.

require 'active_support/all'
"FooBar".underscore

다르게 말했다-

  • require_relative 파일을 호출하는 파일과 관련하여 특별히 지정된 파일이 필요합니다.

  • require $ LOAD_PATH에 포함 된 파일이 필요합니다.


방금 RSpec의 코드 require_relative에 O (1) 상수 및 requireO (N) 선형 에 대한 의견 있습니다. 아마도 차이점은 require_relative보다 선호하는 것 require입니다.


Windows를 사용할 require './1.rb'때 스크립트가 로컬 또는 매핑 된 네트워크 드라이브에서 실행되는 경우 사용할 수 있지만 UNC \ servername \ sharename \ folder 경로에서 실행하면 사용할 필요가 있음을 추가하고 require_relative './1.rb'싶습니다. 다른 이유로 사용하십시오.

참고 URL : https://stackoverflow.com/questions/3672586/what-is-the-difference-between-require-relative-and-require-in-ruby

반응형