Rake中使用#invoke和#execute传递的参数的统一方式



我希望Task以相同的方式获取参数,对调用方方法#invoke#execute:透明

desc "Add task"
task :add do |t, args|
puts args.class
puts "Add"
end
desc "Sub task"
task :sub do |t, args|
puts args.class
puts "Sub"
end
desc "all"
task :all do
Rake::Task['add'].execute("arg1") # cannot set multiple arguments, will fail with "wrong number of arguments"
Rake::Task['sub'].invoke("arg1", "arg2")
end

结果是:

» rake all
String
Add
Rake::TaskArguments
Sub

在检查Rake源代码后,很明显这些实现是不同的。

有没有一种统一的方法来管理争论,无论它们来自哪里?(命令行,#invoke或#execution?(。我使用OptParse作为命令行参数,所以现在我的代码中有两个丑陋的解决方案。

我假设在execute的情况下,如果参数的数量>1,那么您希望execute带有一个参数,它是一个收集所有这些参数的数组,否则execute将使用nil或唯一的输入参数(例如String(执行。因此,调用execute的方式将与调用invoke的方式相匹配,并且execute仍然与原点相同。

您可以为Rake::Task#execute创建一个包装器(别名(,并按照下面的处理输入参数

# Rakefile
Rake::Task.alias_method :old_execute, :execute
Rake::Task.define_method("execute") do |*args|
if args&.size > 1
old_execute(args)
else
old_execute(args&.first)
end
end
# ...
Rake::Task['add'].execute # Rake::TaskArguments
Rake::Task['add'].execute("arg1") # String
Rake::Task['add'].execute("arg1", "arg2") # Array

最新更新