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
'programing' 카테고리의 다른 글
.dmp 파일을 Oracle로 가져오려면 어떻게 해야 합니까? (0) | 2023.07.05 |
---|---|
Microsoft를 사용하여 Excel 2010의 데이터 읽기사무실. 인터럽트.엑셀 (0) | 2023.07.05 |
SQL Server 데이터베이스에서 스크립트를 사용하여 기본 키 삭제 (0) | 2023.07.05 |
저장소 기본 클래스를 스프링 부트 자동 구성에 등록하는 방법이 있습니까? (0) | 2023.07.05 |
Node.js에서 데이터베이스 관련 경합 조건 방지 (0) | 2023.07.05 |