programing

Ruby 1.9.2가 LOAD_PATH에서 "."를 제거하는 이유는 무엇이며, 그 대안은 무엇입니까?

abcjava 2023. 7. 5. 20:02
반응형

Ruby 1.9.2가 LOAD_PATH에서 "."를 제거하는 이유는 무엇이며, 그 대안은 무엇입니까?

Ruby 1.9.2에 대한 최신 변경 사항 세트는 더 이상 현재 디렉터리를 만들지 않습니다..당신의 일부LOAD_PATH제가 가지고 있는 레이크 파일 중에는 다음과 같은 것들이 있습니다..의 일부입니다.LOAD_PATH이로 인해 프로젝트 경로를 기반으로 하는 모든 요구 사항에 대해 "로드할 해당 파일이 없습니다"라고 보고했습니다.이것을 하는 데 특별한 이유가 있었습니까?

수정 사항에 대해서는, 추가$: << "."모든 곳에서 작동하지만, 믿을 수 없을 정도로 구식으로 보이고 저는 그렇게 하고 싶지 않습니다.내 Rake 파일 1.9.2+를 호환할 수 있도록 하려면 어떤 방법이 좋습니까?

그것은 "보안" 위험으로 간주되었습니다.

절대 경로를 사용하여 피할 수 있습니다.

File.expand_path(__FILE__) et al

또는 하는 중

require './filename' (ironically).

또는 를 사용하여

require_relative 'filename'

또는 "디렉토리" 추가

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

Unix 세계에서는 오랫동안 사용자의 경로가 나쁜 것으로 여겨져 왔습니다(예: http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html) 참조).저는 루비 사람들이 그렇게 하지 않는 것이 현명하다는 것을 설득당했다고 생각합니다.

저는 이것이 제가 몇 가지를 깨닫기 전까지는 혼란스러운 변화라는 것을 알았습니다.

.profile(Unix)에서 루비립을 설정하고 이전과 같이 수명을 연장할 수 있습니다.

export RUBYLIB="."

하지만 위에서 언급했듯이, 그렇게 하는 것은 오랫동안 안전하지 않은 것으로 여겨져 왔습니다.

대부분의 경우 Ruby 스크립트에 '.'(예: ./scripts/server)를 추가하여 호출하면 문제를 피할 수 있습니다.

Jörg W Mittag가 지적했듯이, 당신이 사용하고 싶은 것은require_relative그래서 당신이 필요로 하는 파일은 소스 파일에 상대적입니다.require선언 및 현재 작업 중인 dir가 아닙니다.

종속성은 레이크 빌드 파일에 상대적이어야 합니다.

언급URL : https://stackoverflow.com/questions/2900370/why-does-ruby-1-9-2-remove-from-load-path-and-whats-the-alternative

반응형