当使用execute而不是invoke运行任务时,为什么args不是Rake :: TaskArguments的实例?

皱纹

在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::TaskArgumentsexecute包装参数的明确理由

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在使用反射调用方法时出现“对象不是声明类的实例”的问题?

使用 scikit-learn 管道时,为什么 self 不是类实例?

为什么在 Java 中不使用实例对象而不是 ThreadLocal?

为什么Kleisli不是Monoid的实例?

为什么4不是Number的实例?

为什么Exception不是Throwable实例?

为什么使用指针而不是直接实例化对象时不使用类成员的默认值?

使用实例而不是类运行 JUnitCore

为什么iter不是实例的方法而__iter__是实例?

为什么抽象类实例化不是dart中的运行时错误?

为什么数字从Object.prototype继承时不是Object的实例?

为什么这不是google.maps.Map的地图实例?InvalidValueError:setMap:不是Map的实例;

为什么使用类方法而不是仅使用实例的类名?

为什么数字不是typeof和instanceof的Number实例?

为什么会有模板条件:不是CfnCondition的实例?

为什么SimpUserRegistry不是EC2实例正常工作

为什么索引一维数组的实例是BinaryExpression而不是MethodCallExpression?

为什么这会编译对类而不是实例的引用?

为什么toBinaryString不是Integer类中的实例方法?

为什么拆箱数组不是可折叠实例?

为什么要使页面对象实例化而不是静态?

为什么在原型而不是构造函数中声明实例属性?

为什么Free在Scalaz 7.1.5中不是monad实例?

为什么`_isurl`是实例方法而不是numpy`DataSource`的静态方法?

为什么在括号方法中索引 self 而不是实例变量

为什么ZipList不是List的默认应用实例

为什么反射的GetProperty()或GetField()不是实例或扩展方法?

为什么RWST ...可能不是MonadReader,MonadState,MonadWriter的实例

为什么需要在c#中使用所有属性而不是公共实例变量?