2017-09-17 13 views
1

私は最近an "older", 2009, article about how to make a Custom Rake tasksを読んでいます。これまでのところ、最初の反復で動作しますが、私はRake::TestTaskcan be called twiceを見ました。私はそれを行うことができると考えましたが、私のnameはattr_accessorが渡しているシンボルをピックアップしていません。Rake :: TestTaskと同じRakefileでカスタムRakeタスクを2回呼び出すことができません

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コードを読んでも、私はほとんど全てを正しく行っているようです。また、私はRubyの専門家ではなく、すべての小さなトリックだと言います。

答えて

1

メソッド宣言の最後に引数をデフォルト値で保持してください!

理由がrake stuffが発生しているのは、Phil::FooTask.new(:stuff) do |t|コールのためです。 initializeメソッドには2つの引数が必要です。このエラーは、name = :taskと宣言したコンストラクタの宣言にあり、デフォルト値は:taskです。ただし、2番目のパラメータtask_dependenciesが必要です。これは、名前:stuffでタスクを初期化するときに欠落している2番目のパラメータです。

次のようにあなたのinitializeメソッド宣言を変更します。

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

rake -Tを呼び出すときに、あなたが正しいタスクが表示されるはずです。

rake foo # Run the foo task 
rake stuff # Run the stuff task 
関連する問題