ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__)
일부 디렉토리에서 .rb 파일에 액세스하려고하는데 튜토리얼에서이 코드를 사용하라고 지시하지만 gem 파일을 찾는 방법을 알 수 없습니다.
답변:
File.expand_path('../../Gemfile', __FILE__)
현재 파일과 관련된 경로를 알고있을 때 파일의 절대 경로를 가져 오는 다소 못생긴 Ruby 관용구입니다. 작성하는 또 다른 방법은 다음과 같습니다.
File.expand_path('../Gemfile', File.dirname(__FILE__))
둘 다 추악하지만 첫 번째 변형은 더 짧습니다. 그러나 첫 번째 변형은 익숙해지기 전까지는 매우 직관적이지 않습니다. 왜 추가 ..
? (그러나 두 번째 변형은 왜 필요한지에 대한 단서를 줄 수 있습니다).
작동 방식 : File.expand_path
두 번째 인수 (기본값은 현재 작업 디렉터리)에 상대적인 첫 번째 인수의 절대 경로를 반환합니다. __FILE__
코드가있는 파일의 경로입니다.이 경우 두 번째 인수는 파일의 경로이고 File.expand_path
디렉토리를 가정 ..
하므로 경로를 올바르게 가져 오려면 추가 경로를 추가 해야합니다. 작동 방식 :
File.expand_path
기본적으로 다음과 같이 구현됩니다 (다음 코드 path
에서 값은 ../../Gemfile
이고 relative_to
값은 /path/to/file.rb
).
def File.expand_path(path, relative_to=Dir.getwd)
# first the two arguments are concatenated, with the second argument first
absolute_path = File.join(relative_to, path)
while absolute_path.include?('..')
# remove the first occurrence of /<something>/..
absolute_path = absolute_path.sub(%r{/[^/]+/\.\.}, '')
end
absolute_path
end
(조금 더 있고, ~
홈 디렉토리로 확장 되는 등 위의 코드에 다른 문제가있을 수 있습니다.)
위 코드에 대한 호출을 단계별로 수행 absolute_path
하면 먼저 값을 얻은 /path/to/file.rb/../../Gemfile
다음 루프의 각 라운드에 대해 첫 번째 항목 ..
이 이전 경로 구성 요소와 함께 제거됩니다. 먼저 /file.rb/..
제거되고 다음 라운드 /to/..
에서 제거되고 /path/Gemfile
.
긴 이야기를 짧게 만들려면 File.expand_path('../../Gemfile', __FILE__)
현재 파일과 관련된 경로를 알고있을 때 파일의 절대 경로를 가져 오는 트릭입니다. ..
상대 경로 의 추가 기능 은에서 파일 이름을 제거하는 것입니다 __FILE__
.
루비 2.0에서이 Kernel
호출 된 함수 __dir__
로 구현됩니다 File.dirname(File.realpath(__FILE__))
.
File.expand_path('../Gemfile',__dir__)
File.expand_path assumes a directory
비록 __FILE__
디렉토리가 아니지만 마침내 나를 위해 클릭하도록했습니다 . 이해하기 위해 __dir__
실제로 디렉토리를 사용하십시오.
두 가지 참조 :
나는 오늘 이것을 우연히 발견했습니다.
디렉토리 트리의 boot.rb에서 두 디렉토리 위로 이동하는 경우 :
/ railties / lib / rails / generators / rails / app / templates
Gemfile을 보면 File.expand_path("../../Gemfile", __FILE__)
다음 파일 을 참조 한다고 믿게 됩니다./path/to/this/file/../../Gemfile