30

我已经看到了任务具有参数和依赖任务的示例,例如:

task :name, [:first_name, :last_name] => [:pre_name] do |t, args|
  args.with_defaults(:first_name => "John", :last_name => "Dough")
  puts "First name is #{args.first_name}"
  puts "Last name is #{args.last_name}"
end

如果它是任务依赖项,您将如何将参数传递给名称任务,例如:

task :sendLetter => :name
  #do something
end
4

2 回答 2

33

Args 通过调用堆栈向下传递。您只需要确保您的顶级任务捕获所有依赖项所需的所有参数。在您的情况下,您需要first_name完成任务。last_namesend_letter

这是一个示例,它显示了在其他地方定义的命名参数流入依赖项(即使它们没有在依赖项中定义),但与顶级任务参数的名称不匹配的参数是 nil。

desc 'Bar'
task :bar, :nom do |task, args|
  puts "BAR NOM: #{args[:nom]}"
  puts "BAR NAME: #{args[:name]}"
end

desc 'Foo'
task :foo, [:name] => :bar do |task, args|
  puts "FOO NAME: #{args[:name]}"
end

运行rake foo[baz]产量

BAR NOM: 
BAR NAME: baz
FOO NAME: baz

有趣的是,在任务中使用args.with_defaults(nom: 'Jaques')foo依赖任务没有影响——nom仍然为零。

耙版本:rake, version 10.0.3

红宝石版本:ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]

于 2013-02-13T22:31:38.507 回答
9

您可能会得到的最接近的是

task :sendLetter do
  task(:name).invoke("first", "last")
end

或者

task :sendLetter do
  task(:name).execute(["first", "last"])
end

你可以做类似的事情

task :sendLetter => task(:name).invoke("first", "last")

name但无论您是否要求,这都会调用sendLetter

Task#invoke仅在尚未调用任务时才调用该任务,并首先调用任何未调用的先决条件。Task#execute总是调用任务但不调用任何先决条件。请注意,参数不会影响 的调用一次性质Task#invoke:如果您调用参数化任务两次,则无论参数是否不同,它都只会运行一次。

于 2011-07-10T17:20:52.370 回答