2017-09-17 1 views
1

내가 최근 an "older", 2009, article about how to make a Custom Rake tasks를 참조하십시오. 지금까지 첫 번째 반복 작동,하지만 난 Rake::TestTaskcan be called twice 것을보고, 그래서 내가 그것을 할 수 있지만 내 name attr_accessor 내가 그것을 통과하고있어 기호를 따기되지 않는다 생각.사용자 정의 레이크 작업은 레이크 unike 같은 Rakefile에 두 번 호출 할 :: TestTask

require 'rake' 
require 'rake/tasklib' 

module Phil 
    class FooTask < Rake::TaskLib 
    attr_accessor :name 
    attr_accessor :data 
    attr_accessor :task_dependencies 

    def initialize(name = :task, task_dependencies) 
     @name = name 
     @data = nil 
     yield self if block_given? 
     @task_dependencies = task_dependencies 
     define 
    end 

    def define 
     desc "Run the #{@name} task" 
     task @name => @task_dependencies do 
     puts 'Some Test being Printed' 
     puts @data 
     sh 'echo blah' 
     end 
     self 
    end 
    end 
end 

Phil::FooTask.new :foo, [:call_me_first, :call_me_second] 

task :call_me_first do 
    puts 'I am called first because I am a dependency' 
end 

task :call_me_second do 
    puts 'I am called second because Im also a dependency' 
end 

Phil::FooTask.new(:stuff) do |t| 
    t.data = 'I am a stuff task.' 
end 

다음은 내가 얻은 결과입니다.

C:\Users\user01\Desktop 
λ rake --tasks 
rake foo # Run the foo task 
rake stuff # Run the stuff task 

C:\Users\user01\Desktop 
λ rake foo 
I am called first because I am a dependency 
I am called second because Im also a dependency 
Some Test being Printed 

echo blah 
blah 

C:\Users\user01\Desktop 
λ rake stuff --trace 
** Invoke stuff (first_time) 
rake aborted! 
Don't know how to build task '{}' (see --tasks) 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/task_manager.rb:58:in `[]' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/task.rb:61:in `lookup_prerequisite' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/task.rb:57:in `block in prerequisite_tasks' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/task.rb:57:in `map' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/task.rb:57:in `prerequisite_tasks' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/task.rb:214:in `invoke_prerequisites' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/task.rb:193:in `block in invoke_with_call_chain' 
C:/tools/ruby23/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/task.rb:187:in `invoke_with_call_chain' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/task.rb:180:in `invoke' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:152:in `invoke_task' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:108:in `block (2 levels) in top_level' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:108:in `each' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:108:in `block in top_level' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:117:in `run_with_threads' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:102:in `top_level' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:80:in `block in run' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:178:in `standard_exception_handling' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:77:in `run' 
C:/tools/ruby23/lib/ruby/gems/2.3.0/gems/rake-12.0.0/exe/rake:27:in `<top (required)>' 
C:/tools/ruby23/bin/rake:22:in `load' 
C:/tools/ruby23/bin/rake:22:in `<main>' 
Tasks: TOP => stuff 

왜 레이크 작업이 실패하는지 잘 모르겠습니다. Rake's TestTask 코드를 읽었을 때도 거의 모든 것을 올바르게 수행하고있는 것으로 보입니다. 나는 또한 루비와 모든 작은 속임수에 대해 전문적인 사람이 아니라고 말할 것이다.

답변

1

은 메서드 선언에서 마지막에 기본 값으로 인수를 유지!

rake stuff이 오류가 제기되는 이유는 당신의 Phil::FooTask.new(:stuff) do |t| 호출이다. initialize 메서드에는 두 개의 인수가 필요합니다. 오류는 :task의 기본값 name = :task을 선언 한 생성자의 당신의 선언입니다. 그러나 두 번째 매개 변수 task_dependencies이 필요합니다. 그것은 이름 :stuff와 함께 작업을 초기화 할 때 당신이 놓치고있는 두 번째 매개 변수입니다.

def initialize(name = :task, task_dependencies = []) 

은 그럼 당신은 rake -T를 호출 할 때 올바른 작업을 참조해야합니다 다음과 같이

initialize 메소드 선언을 수정

rake foo # Run the foo task 
rake stuff # Run the stuff task 
관련 문제