我有一个 rake 任务需要将一个值插入到多个数据库中。
我想从命令行或从另一个 rake 任务将这个值传递到 rake 任务。
我该怎么做?
最佳答案
您可以通过向任务调用添加符号参数来在 rake 中指定形式参数。例如:
require 'rake'
task :my_task, [:arg1, :arg2] do |t, args|
puts "Args were: #{args} of class #{args.class}"
puts "arg1 was: '#{args[:arg1]}' of class #{args[:arg1].class}"
puts "arg2 was: '#{args[:arg2]}' of class #{args[:arg2].class}"
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,false] Args were: {:arg1=>"1", :arg2=>"false"} of class Rake::TaskArguments arg1 was: '1' of class String arg2 was: 'false' of class String > 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'\]
关于ruby - 如何将命令行参数传递给 rake 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/825748/