2017-09-17 51 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