我有一个 rake 任务需要将值插入多个数据库。
我想从命令行或另一个 rake 任务将此值传递给 rake 任务。
我怎样才能做到这一点?
您可以通过向任务调用添加符号参数来在 rake 中指定正式参数。例如:
require 'rake'
task :my_task, [:arg1, :arg2] do |t, args|
puts "Args were: #{args}"
end
task :invoke_my_task do
Rake.application.invoke_task("my_task[1, 2]")
end
# or if you prefer this syntax...
task :invoke_my_task_2 do
Rake::Task[:my_task].invoke(3, 4)
end
# a task with prerequisites passes its
# arguments to it prerequisites
task :with_prerequisite, [:arg1, :arg2] => :my_task #<- name of prerequisite task
# to specify default values,
# we take advantage of args being a Rake::TaskArguments object
task :with_defaults, :arg1, :arg2 do |t, args|
args.with_defaults(:arg1 => :default_1, :arg2 => :default_2)
puts "Args with defaults were: #{args}"
end
然后,从命令行:
> rake my_task[1,2] Args were: {:arg1=>"1", :arg2=>"2"} > rake "my_task[1, 2]" Args were: {:arg1=>"1", :arg2=>"2"} > rake invoke_my_task Args were: {:arg1=>"1", :arg2=>"2"} > rake invoke_my_task_2 Args were: {:arg1=>3, :arg2=>4} > rake with_prerequisite[5,6] Args were: {:arg1=>"5", :arg2=>"6"} > rake with_defaults Args with defaults were: {:arg1=>:default_1, :arg2=>:default_2} > rake with_defaults['x','y'] Args with defaults were: {:arg1=>"x", :arg2=>"y"}
如第二个示例所示,如果要使用空格,则必须使用目标名称周围的引号来防止 shell 拆分空间处的参数。
查看rake.rb中的代码,看起来 rake 不会解析任务字符串以提取先决条件的参数,因此您无法执行task :t1 => "dep[1,2]"
。为先决条件指定不同参数的唯一方法是在依赖任务操作中显式调用它,如:invoke_my_task
和:invoke_my_task_2
。
请注意,某些 shell(如 zsh)要求您转义括号: rake my_task\['arg1'\]
除了回答 kch(我没有找到如何发表评论,抱歉):
在rake
命令之前,您不必将变量指定为ENV
变量。您可以像往常一样将它们设置为通常的命令行参数:
rake mytask var=foo
并从你的 rake 文件中访问那些作为 ENV 变量,如:
p ENV['var'] # => "foo"
选项和依赖项需要在数组内部:
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
然后
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"}
注意:变量
task
是任务对象,除非您了解 / 关心 Rake 内部,否则不是很有帮助。
铁路注意:
如果从 rails 运行任务,最好通过添加
=> [:environment]
来预加载环境,这是一种设置相关任务的方法。
task :work, [:option, :foo, :bar] => [:environment] do |task, args|
puts "work", args
end