2017-09-17 90 views
1

我最近讀的是an "older", 2009, article about how to make a Custom Rake tasks。到目前爲止,它適用於第一次迭代,但我看到Rake::TestTaskcan be called twice,所以我想我可以做到這一點,但我的name attr_accessor沒有拿起我傳遞給它的符號。自定義Rake任務無法在同一Rakefile中被調用兩次Rake :: 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任務失敗。即使從閱讀Rake's TestTask的代碼,似乎我正在做的大部分都是正確的。我還會說,我不是一個專業的Ruby和所有的小技巧。

回答

1

在方法聲明中將參數保留爲最後的默認值!

原因rake stuff正在引發錯誤是因爲您的Phil::FooTask.new(:stuff) do |t|調用。您的initialize方法需要兩個參數。錯誤在於你聲明構造函數的地方,你聲明瞭name = :task,它的默認值爲:task。但是,第二個參數task_dependencies預計。這是初始化名稱爲:stuff的任務時缺少的第二個參數。

修改您的initialize方法聲明如下:

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

那麼你應該看到正確的任務調用rake -T時:

rake foo # Run the foo task 
rake stuff # Run the stuff task