2010-08-11 1 views
19

rubygem을 메모리에 "다시로드"하거나 "새로 고침"할 수있는 방법이 있습니까? irb에서 연주 할 때 가끔 gem 파일을 수정하고 싶습니다. 동일한 보석이 필요하면 메모리로 업데이트되지 않고 "false"가 출력됩니다. 현재 IRB를 종료하고 IRB로 돌아가서 다시 보석을 요구해야합니다. 더 나은 방법이 있어야합니다 ... 그게 무엇입니까?IRB에서 rubygem을 새로 고침

+0

이 기능을 코딩해야한다면 어디로 가야합니까? 루비 젬? 해당 커뮤니티가 일반적으로 새로운 기능 요청을 수락합니까? – Schneems

답변

17

다른 사람이 제안 했으므로 Kernel # load를 사용할 수 있습니다. . 그러나 발견하고이 지식으로 무장 "$에 저장되어있는 요구 된 모든 파일과 각각의 보석 파일을로드 시간을 낭비하지 말고, 여기에 다시로드 IRB 명령의 예를 들면 다음과 같습니다

def reload(require_regex) 
    $".grep(/^#{require_regex}/).each {|e| load(e) } 
end 

, 당신이 경우 IRB의 hirb 보석을 사용하고, 당신은 단순히 다시로드합니다 :

>> reload 'hirb' 

만약 어떤 이유 부하가 (이 요구하는 것보다 파일 확장자에 대한 까다로워입니다) 작동하지 않습니다, 당신은에 의한 파일을 다시 요구할 수 있습니다 먼저 $로 항목을 삭제 "합니다. 이 조언을 통해 위의 명령은 다음과 같습니다.

def reload(require_regex) 
    $".grep(/^#{require_regex}/).each {|e| $".delete(e) && require(e) } 
end 

어느 것이 든 당신을 위해 선택하십시오. 개인적으로 나는 후자를 사용한다.

+0

이것은 파일 시스템에서 포함 된 스크립트에서도 작동합니까? 그것은 내 작품에 대한 작동하지 않았다 ... 및 내 require 문을 다음과 같이 보입니다 : 'require "# {File.expand_path (__ FILE __)} /../ lib/query"' – picardo

+2

아니, 아니. 정규식은 너무 제한적이므로 전체 경로를 지정해야합니다. 내 버전을 수정하여 ^을 /로 바꾸십시오. – Trejkaz

8

로드 'filename.rb'변경 한 것 각각 한 번에

하나 ...

6

한 가지 방법은 Kernel#load을 사용하는 것입니다. 파일 확장자를 명시 적으로 포함해야한다는 점을 제외하고는 Kernel#require과 거의 비슷하게 사용할 수 있습니다. 그러나 그것은 단점을 가지고 있습니다 (클래스의 수퍼 클래스를 변경하는 것이 불가능하므로 class Foo < Struct.new(:foo); end과 같은 간단한 것조차도). 그래서 이것을 수행하는 더 좋은 방법을 알고 싶습니다.

레일에서는 스크립트/콘솔에서 reload!으로이 작업을 수행 할 수 있지만 어떤 종류의 마법을 사용하는지 알지 못합니다.

This gist 유망 해 보이지만 테스트하지 않았습니다.

+0

'reload!'는 단지'app /'디렉토리에있는 것을 로딩하기로되어 있습니다. 또한 많은 제약 사항이 개발 환경에서 익명 클래스로 표시되어 각 요청에 대해 완전히 삭제되고 다시 초기화 될 수있는 이유는 이것에 제한이 있습니다. – tadman