2010-03-28 10 views
33

나는 아래에 단순화 한 레이크 작업을 가지고 있습니다. Windows에서 Ruby 1.9를 사용하고 있습니다.왜 레이크가 여러 작업을 연속적으로 호출 할 수 없습니까?

아마도 아래의 "list_all_levels"라는 Rake 작업을 호출 한 결과를 추측하고 싶습니까? 다음과 같아야합니다 :

"Hello level 1" 
"Hello level 2" 
"Hello level 3" 

그러나 나에게 알려지지 않은 이유 때문에 "Hello level 1"만 인쇄 한 다음 중지합니다.

즉, 항상 첫 번째 작업 만 호출합니다. arg "42"를 전달하기 위해 첫 번째 행을 변경하면 "Hello level 42"가 인쇄 된 다음 중지됩니다.

이유는 무엇입니까 아니요은 3 번 작업을 호출하고 모든 3 줄을 인쇄합니까? 그리고 예상대로 작동하도록하는 방법이 있습니까?

task :list_all_levels => [] do 
    Rake::Task[:list].invoke 1 
    Rake::Task[:list].invoke 2 
    Rake::Task[:list].invoke 3 
end 

task :list, [:level] => [] do |t, args| 
    puts "Hello level #{args.level}" 
end 

답변

47

문제는 을 필요로하는 경우 invoke에만 작업을 호출하는 것입니다. rake --trace를 실행하면 보여줍니다

 
(in /tmp/ruby) 
** Invoke default (first_time) 
** Execute default 
** Invoke list (first_time) 
** Execute list 
Hello level 1 
** Invoke list 
** Invoke list 

그래서 당신은 작업을 :list 두 번 더 호출하려고 볼 수 있습니다. 그러나 당신이 할 수있는 한 가지 메인 작업의 시체를 변경하는 것입니다 :

task :default => [] do 
    Rake::Task[:list].invoke 1 
    Rake::Task[:list].reenable 
    Rake::Task[:list].invoke 2 
    Rake::Task[:list].reenable 
    Rake::Task[:list].invoke 3 
end 

다음 :list 작업이 다시 필요하며 올바르게 3 문을 출력합니다.

클리너 방법은 use execute rather than invoke이다해야 할 일 : 단지 args보다는 args.level 어떤 이유로 사용하도록 puts 문을 변경

task :default => [] do 
    Rake::Task[:list].execute 1 
    Rake::Task[:list].execute 2 
    Rake::Task[:list].execute 3 
end 

task :list, [:level] => [] do |t, args| 
    puts "Hello level #{args}" 
end 

합니다. 위의 링크에서 설명한 invoke 이상의 execute을 사용하는 다른 몇 가지주의 사항이 있습니다.

+0

정말 감사합니다. – kizzx2

+2

@PandaWood를 '실행'하도록 변경하는 경우 조심하십시오. = [rake execute vs invoke] (http://chrisroos.co.uk/blog/2007-12-06-ruby-rake) -invoke-vs-execute) – Ron

+0

이것은 매우 반 직관적 인 것처럼 보입니다. 그들이 왜 이렇게 만들었는지에 대한 아이디어가 있습니까? – marcovtwout

6

새 실행 전에 작업을 다시 활성화해야합니다.이 경우 reenable 메서드 만 실행하면됩니다. 사용자 Rushakoff가 언급 한 것처럼

Rake::Task[:list].reenable 
관련 문제