루비 1.9.2에 대한 최신 변경 집합은 더 이상 현재 디렉토리하지 않습니다 .
당신의 일부를 LOAD_PATH
. 나는 그 .
중 일부 라고 가정하는 사소한 수의 Rakefile을 가지고 LOAD_PATH
있기 때문에 그것들이 파산되었습니다 (프로젝트 경로를 기반으로하는 모든 요구 사항 진술에 대해 “로드 할 파일이 없습니다”). 이를위한 특별한 이유가 있습니까?
수정에 관해서는 $: << "."
모든 곳 에서 추가하는 것이 효과적이지만 믿을 수 없을 정도로 해키처럼 보이고 싶지 않습니다. 내 Rakefiles 1.9.2 이상을 호환시키는 가장 좋은 방법은 무엇입니까?
답변
“보안”위험으로 간주되었습니다.
절대 경로를 사용하여 해결할 수 있습니다.
File.expand_path(__FILE__) et al
또는
require './filename' (ironically).
또는 사용하여
require_relative 'filename'
또는 “include”디렉토리 추가
ruby -I . ...
또는 irb를 사용하여 동일하거나;
$irb -I .
답변
두 가지 이유가 있습니다.
- 견고성
- 보안
둘 다 동일한 기본 원칙을 기반으로합니다. 일반적으로 코드가 실행될 때 현재 디렉토리가 무엇인지 알 수 없습니다. 즉, 파일이 필요할 때 현재 디렉토리에있는 파일에 의존 할 경우 해당 파일이 있을지 여부 또는 실제로있을 것으로 예상되는 파일인지 여부를 제어 할 방법이 없습니다.
답변
다른 답변에서 지적했듯이 .
로드 경로 Dir.pwd
에서로드중인 현재 파일의 디렉토리가 아닌 현재 작업 디렉토리를 참조하기 때문에 보안 위험 이 있습니다 . 따라서 스크립트를 실행하는 사람은 단순히 cd
다른 디렉토리로 이동하여 이를 변경할 수 있습니다 . 안좋다!
__FILE__
대안으로 구성된 전체 경로를 사용 하고 있습니다.
require File.expand_path(File.join(File.dirname(__FILE__), 'filename'))
와 달리 require_relative
Ruby 1.8.7과 호환됩니다.
답변
사용하다 require_relative 'file_to_require'
1.8.7에서 require_relative가 작동하도록하려면 코드에서 이것을 던져라 :
unless Kernel.respond_to?(:require_relative)
module Kernel
def require_relative(path)
require File.join(File.dirname(caller.first), path.to_str)
end
end
end
답변
‘.’ 귀하의 경로에서 오랫동안 유닉스 세계에서 나쁜 것으로 간주되었습니다 (예 : http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html 참조 ). 나는 루비 사람들이 그렇게하지 않는 지혜를 설득했다고 가정한다.
답변
몇 가지 사실을 깨닫기 전까지는 이것이 혼란스러운 변화라는 것을 알았습니다.
.profile (Unix)에서 RUBYLIB를 설정하고 이전과 마찬가지로 계속 사용할 수 있습니다.
export RUBYLIB="."
그러나 위에서 언급했듯이 오랫동안 그렇게하는 것은 안전하지 않은 것으로 간주되었습니다.
대부분의 경우, 앞에 ‘.’를 붙여 루비 스크립트를 호출하면 문제를 피할 수 있습니다. 예 : ./scripts/server
답변
Jörg W Mittag가 지적했듯이, 사용하려는 것은 현재 작업 디렉토리가 아닌 선언 require_relative
의 소스 파일과 관련 이 있기 때문에 필요한 파일 이라고 생각합니다 require
.
종속성은 레이크 빌드 파일과 관련이 있어야합니다.