[ruby] Ruby 1.9.2가“.”을 제거하는 이유 LOAD_PATH에서 대안이 무엇입니까?

루비 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_relativeRuby 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.

종속성은 레이크 빌드 파일과 관련이 있어야합니다.