2012-01-21 4 views
2

나는 TextMate 1.5.10 (Mac OSX 10.7.2)을 사용하여 perl modulino application을 작성하고 있습니다. 기능을 확인하기 위해 나는 prove 명령 줄 도구로 실행되도록 고안된 테스트 스크립트를 사용하고 있습니다.TextMate에서 prove 형식으로 설계된 테스트 펄 스크립트를 어떻게 실행할 수 있습니까?

디렉토리 구조의 예 나는이 같은 모습을 사용하고 있습니다 :

text_mate_test/MyModule.pm 
text_mate_test/t/001_load_test.t 

001_load_test.t 파일은 다음과 같습니다 :

#!/usr/bin/perl 

use Modern::Perl; 
use Test::More; 
use MyModule; 

my $testObj = new_ok("MyModule", undef, "Initial load test."); 

done_testing(); 

I "가에 prove 또는 prove -v을 실행 text_mate_test "디렉토리에서 예상대로 모든 것이 전달됩니다.

터미널로 건너 뛰지 않고도 테스트 파일을 실행할 수있는 TextMate에서 바로 가기 키를 설정하고 싶습니다. 현재 Cmd + R이있는 TextMate에서 "001_load_test.t"를 직접 실행하면 "@MIN에서 MyModule.pm을 찾을 수 없습니다"라는 메시지가 나옵니다. 그것은 테스트 스크립트가 직접 실행되도록 설계되지 않았기 때문에 예상됩니다. (필자는 여전히 테스트 파일을 작성하는 데에는 아직 익숙하지 않지만이를 설정하는 것이 적절한 방법이라고 생각합니다.)

테스트 파일 자체를 변경하지 않으려는 의도로 실행 중입니다. 바로 가기 키를 설정하여 TextMate 내부에서 파일을 정확하게 실행할 수 있습니까? 당신이합니다 (use MyModule 전) 코드의 상단에

use lib '..'; 

을 추가하는 경우

답변

2

이렇게하는 것이 더 좋은 방법입니다. 의 TextMate 번들 편집기에서

(메뉴 모음 -> 번들이 -> 번들 편집기 ->보기 번들 편집기), I는 기본 업데이트되었습니다 "펄 -> 스크립트 실행"이것에 번들 :

#!/usr/bin/env ruby 

require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/executor" 
require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/save_current_document" 

TextMate.save_current_document 
TextMate::Executor.make_project_master_current_document 

### If it's a ".t" test script in a "t" directory, run prove 
if (ENV["TM_FILEPATH"] =~ /^.*\/(t\/[^\/]+)$/) 

    ### Grab the relative file path for more legible output 
    relative_file_path = $1 

    ### Jump up one directory so prove will work 
    Dir.chdir("../"); 

    ### Call prove with args to run only the file you are working on. 
    TextMate::Executor.run("prove", :script_args => ["-v", relative_file_path]); 

### Otherwise, run with perl 
else 
    TextMate::Executor.run(ENV["TM_PERL"] || "perl", "-I#{ENV["TM_BUNDLE_SUPPORT"]}", 
     "-Mexception_handler", ENV["TM_FILEPATH"], 
     :version_args => ["-e", 'printf "Perl v%vd", $^V;']) 
end 

는 여기 Bundle Editor에서 어떻게 보이는지 보여주는 스크린 샷.

TextMate Bundle Editor Screen Shot for using prove to run perl test scripts

이것의 장점은 펄과 증명하여 테스트 스크립트와 함께 일반 스크립트를 실행합니다 (기본적으로 Cmd를 + R) 같은 단축키를 사용할 수 있다는 것입니다.

이것은 내가 찾고있는 것입니다.


업데이트 : 내가 처음이 개발되면, 난 단지 "t"디렉토리에 하나의 테스트 스크립트를했다. 이 답변의 원본 버전에있는 코드가 모든 스크립트에서 실행된다는 다른 테스트 스크립트를 추가 할 때까지는 알지 못했습니다. 일하는 사람 만이 아닙니다. 예상되는 동작으로 되돌아 가려면, 번들 코드를 업데이트하여 prove이 활성 스크립트에서만 실행되도록해야합니다.

0

그것은 모듈을 찾을 수있는 프로그램을 가능하게 할 것이다. 이렇게하면 @INC에 text_mate_test 디렉토리가 추가되고 Perl이 모듈을 찾을 수있게되지만 프로그램을 직접 실행하는 데있어 다른 문제가 발생할 수 있습니다.

1

나는 해결책을 내놓았다. "Run Script with prove"라는 새로운 Perl 번들을 만들고 Shift-Cmd-R과 연결하십시오. 번들에 대한 코드는 다음과 같습니다

#!/usr/bin/env ruby 

require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/executor" 
require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/save_current_document" 

TextMate.save_current_document 
TextMate::Executor.make_project_master_current_document 


### If it's a ".t" test script in a "t" directory, run prove 
if (ENV["TM_FILEPATH"] =~ /^.*\/(t\/[^\/]+)$/) 

    ### Use the relative file path for more legible output 
    relative_file_path = $1 

    ### Jump up one directory so prove will work 
    Dir.chdir("../"); 

    ### Call prove with args to run only the file you are working on. 
    TextMate::Executor.run("prove", :script_args => ["-v", relative_file_path]); 

else 

    error_string = "This script's filepath doesn't end with /t/.*\.t\n" 
    error_string += "That is required for the 'Perl -> Run Script with prove' bundle to work.\n" 

    TextMate::Executor.run("echo", :script_args => [error_string]); 

end 

참고 : 이것은 시행 착오를 해킹 한 무리의 결과입니다. 나는 그것을하는 것이 "옳은"것인지 모르지만, 이것은 나를 위해 일합니다. 마지막 두 줄을 제외하고 모두 TextMate와 함께 제공되는 원래 "Run Script"번들의 복사본입니다. 그것을 바탕으로, 이것은 꽤 안전해야합니다.

업데이트 : 처음 만들 때 "t"디렉토리에 하나의 테스트 파일 만있었습니다. 더 추가하면 번들의 원래 버전이 모든 테스트 파일을 실행하고 있음을 발견했습니다. 이 코드는 작업중인 테스트 스크립트 만 실행하는 예상되는 동작에 대한 업데이트를 나타냅니다. 결국 내가 그 일을 끝내기 시작 했으므로 대체 수단을 추가해야했습니다. 표준 테스트 파일 경로 형식과 일치하지 않는 스크립트를 실행하려고하면 오류 메시지가 나타납니다.

+0

또 다른 대답은 내가 더 좋다고 생각합니다. 하나의 단축키를 일반 펄 스크립트와 테스트 스크립트 모두에 사용할 수 있습니다. 누군가가 별도의 바로 가기 키를 설정하는 방법을 찾고있는 경우에 대비하여 여기에 하나를 남겨두고 있습니다. –