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

lpwwtiir  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(237)

我希望任务以同样的方式获取参数,对调用方方法是透明的 #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

检查源代码后,很明显这些实现是不同的。
是否有一种统一的方法来管理参数,无论它们来自何处(命令行,#调用还是#执行?)。我使用optpasse作为命令行参数,因此我现在的代码中有两个难看的解决方法。

yh2wf1be

yh2wf1be1#

我想,如果 execute 如果参数数>1,则需要 execute 参数是一个数组,用于收集所有这些参数,否则为 execute 将使用nil或唯一的输入参数(例如字符串)执行。所以你打电话的方式 execute 将与您的呼叫方式相匹配 invokeexecute 还是和原点一样。
您可以为创建一个 Package 器(别名) 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

相关问题