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

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

我该怎么做呢?


当前回答

除了kch的回答(我不知道如何留下评论,对不起):

在rake命令之前,您不必将变量指定为ENV变量。你可以像设置命令行参数一样设置它们:

rake mytask var=foo

然后从rake文件中访问这些ENV变量,就像这样:

p ENV['var'] # => "foo"

其他回答

另一个常用的选项是传递环境变量。在你的代码中,你可以通过ENV['VAR']读取它们,并且可以在rake命令之前传递它们,比如

$ VAR=foo rake mytask
desc 'an updated version'
task :task_name, [:arg1, :arg2] => [:dependency1, :dependency2] do |t, args|
    puts args[:arg1]
end

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

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

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

上面描述的大多数方法对我来说都不起作用,也许它们在新版本中已弃用。 最新的指南可以在这里找到: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任务:

rake task arg1 arg2

然后使用:

task :task do |_, args|
  puts "This is argument 1: #{args.first}"
end

添加以下rake gem补丁:

Rake::Application.class_eval do

  alias origin_top_level top_level

  def top_level
    @top_level_tasks = [top_level_tasks.join(' ')]
    origin_top_level
  end

  def parse_task_string(string) # :nodoc:
    parts = string.split ' '
    return parts.shift, parts
  end

end

Rake::Task.class_eval do

  def invoke(*args)
    invoke_with_call_chain(args, Rake::InvocationChain::EMPTY)
  end

end