任务组的rake参数

时间:2013-11-27 14:26:45

标签: ruby-on-rails ruby rake

如何将参数传递给rake任务的

我可以将参数传递给每个单独的任务(foo1,foo2):

desc "foo1"
task :foo1, [ :mode ] => :environment do |t, args|

  mode = args[:mode]
  puts "foo1 mode = #{mode}"

end

desc "foo2"
task :foo2, [ :mode ] => :environment do |t, args|

  mode = args[:mode]
  puts "foo2 mode = #{mode}"

end

desc "all_foos"
task :all_foos, [ :mode ] => [ :foo1, :foo2 ]

如您所见,foo1和foo2分组在all_foos中。 all_foos任务也接受mode参数,但我不知道如何将mode参数传递给all_foos中的foo1和foo2。

2 个答案:

答案 0 :(得分:1)

您可以调用all_foos任务中的任务并传入您想要的任何参数:

desc "all_foos"
task :all_foos, [ :mode ] => :environment do |task, args|
  Rake::Task['foo1'].invoke args[:mode]
  Rake::Task['foo2'].invoke args[:mode]
end

以下是更多:How to run Rake tasks from within Rake tasks?

答案 1 :(得分:0)

您是否尝试过代码?

执行代码时

require 'rake'

task :environment 

desc "foo1"
task :foo1, [ :mode ] => :environment do |t, args|

  mode = args[:mode]
  puts "foo1 mode = #{mode}"

end

desc "foo2"
task :foo2, [ :mode ] => :environment do |t, args|

  mode = args[:mode]
  puts "foo2 mode = #{mode}"

end

desc "all_foos"
task :all_foos, [ :mode ] => [ :foo1, :foo2 ]

Rake.application['all_foos'].invoke('par1')

我得到了

foo1 mode = par1
foo2 mode = par1

Rake.application['all_foos'].invoke('par2')

我明白了:

foo1 mode = par2
foo2 mode = par2

这是您想要的解决方案。

注: Rake.application['all_foos'].invoke('par2')与外部佣金调用rake all_foos[par2]

相同

更进一步:您还可以使用不同的参数。

查看此代码:

require 'rake'

task :environment 

desc "foo1"
task :foo1, [ :mode1 ] => :environment do |t, args|

  mode = args[:mode1]
  puts "foo1 mode = #{mode}"

end

desc "foo2"
task :foo2, [ :mode2 ] => :environment do |t, args|

  mode = args[:mode2]
  puts "foo2 mode = #{mode}"

end

desc "all_foos"
task :all_foos, [ :mode1, :mode2 ] => [ :foo1, :foo2 ]

Rake.application['all_foos'].invoke('par1', 'par2')

使用Rake.application['all_foos'].invoke('par1', 'par2')(或rake all_foos[par1,par2]),我得到:

foo1 mode = par1
foo2 mode = par2

使用Rake.application['all_foos'].invoke('par1', 'par2')(或rake all_foos[par1,par2]),我得到:

foo1 mode = par1
foo2 mode = par2

Rake.application['all_foos'].invoke(nil, 'par2')我得到了

foo1 mode = 
foo2 mode = par2

Rake.application['all_foos'].invoke('par1')我得到了

foo1 mode = par1
foo2 mode = 

如果您的主要任务包含所有参数名称,则可以在子任务中选择所需的参数。

缺点:主要任务和子任务之间的调用顺序不同。