在Rake中,使用execute
命令从另一个任务显式运行一个任务时,即:
Rake::Task['some_task'].execute(args=[arg1, arg2])
在运行的任务中,args
它将是一个常规数组。如果使用该invoke
函数运行任务,即:
Rake::Task['some_task'].invoke(arg1, arg2)
该args
命令将是的实例Rake::TaskArguments
。因此,您可以使用类似的方法Rake::TaskArguments.with_defaults
。
为什么存在这种差异?有没有办法确保任务中的args将是的实例Rake::TaskArguments
?
通常,调用任务的方法更改参数的标识似乎很奇怪。
很好的问题,我找不到invoke
将参数包装为Rake::TaskArguments
和execute
不包装参数的明确理由。
execute
从中调用,invoke
以完成任务的工作,此时,参数已被包装到Rake::TaskArguments
实例中。这就是为什么在“常规”用法中您会Rake::TaskArguments
在任务中得到帮助的原因。我想说正常用法是在命令行上指定的任务或作为依赖项。在这些情况下,您会invoke
在rake本身中通过via调用任务。
为了确保任务中的参数始终是Rake::TaskArguments
实例,我想唯一的方法是execute
在自己的代码中使用时包装参数。例如
Rake::Task['some_task'].execute(Rake::TaskArguments.new(argument_names, [arg1, arg2]))
argument_names
是必需的,并且是任务期望的参数名称。实际上,您可以从任务本身获得该信息Rake::Task['some_task'].arg_names
。名称数组中的参数位置需要与命名参数的值中的位置匹配。
可能值得向rake团队提出问题:https : //github.com/ruby/rake/issues
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句