我有一个rake任务,需要将一个值插入多个数据库。

我想从命令行或从另一个rake任务中将这个值传递给rake任务。

我该怎么做呢?


当前回答

这里我不明白的一点是如何处理任意参数。如果你传递了任务定义中没有列出的参数,它们仍然可以在args.extras下访问:

task :thing, [:foo] do |task, args|
  puts args[:foo]     # named argument
  puts args.extras    # any additional arguments that were passed
end

其他回答

上面描述的大多数方法对我来说都不起作用,也许它们在新版本中已弃用。 最新的指南可以在这里找到:http://guides.rubyonrails.org/command_line.html#custom-rake-tasks

下面是该指南的复制粘贴示例:

task :task_name, [:arg_1] => [:pre_1, :pre_2] do |t, args|
  # You can use args from here
end

像这样调用它

bin/rake "task_name[value 1]" # entire argument string should be quoted

在上面的答案中,传递参数的方法是正确的。然而,要运行带有参数的rake任务,新版本的rails涉及到一个小技术问题

它将与rake“namespace:taskname['argument1']”一起工作

注意从命令行运行任务时使用的倒引号。

我在rake文件中使用了一个常规的ruby参数:

DB = ARGV[1]

然后我在文件底部去掉rake任务(因为rake将根据参数名查找任务)。

task :database_name1
task :database_name2

命令行:

rake mytask db_name

这感觉比我的var=foo ENV var和任务参数[blah, blah2]解决方案更干净。 存根有点麻烦,但如果您只有几个一次性设置的环境,那也不算太糟

选项和依赖项需要在数组中:

namespace :thing do
  desc "it does a thing"
  task :work, [:option, :foo, :bar] do |task, args|
    puts "work", args
  end
  
  task :another, [:option, :foo, :bar] do |task, args|
    puts "another #{args}"
    Rake::Task["thing:work"].invoke(args[:option], args[:foo], args[:bar])
    # or splat the args
    # Rake::Task["thing:work"].invoke(*args)
  end

end

Then

rake thing:work[1,2,3]
=> work: {:option=>"1", :foo=>"2", :bar=>"3"}

rake thing:another[1,2,3]
=> another {:option=>"1", :foo=>"2", :bar=>"3"}
=> work: {:option=>"1", :foo=>"2", :bar=>"3"}

注意:变量任务是任务对象,除非你知道/关心Rake内部,否则没有多大帮助。

RAILS的注意:

如果从Rails运行任务,最好通过添加=> [:environment]来预加载环境,这是一种设置依赖任务的方法。

  task :work, [:option, :foo, :bar] => [:environment] do |task, args|
    puts "work", args
  end

这里我不明白的一点是如何处理任意参数。如果你传递了任务定义中没有列出的参数,它们仍然可以在args.extras下访问:

task :thing, [:foo] do |task, args|
  puts args[:foo]     # named argument
  puts args.extras    # any additional arguments that were passed
end