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

Why are `args` not an instance of Rake::TaskArguments when a task is run with `execute` instead of `invoke`?

在 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.

等方法

为什么会存在这种差异?有没有办法确保任务中的参数将是 Rake::TaskArguments 的实例?

一般来说,调用任务的方法改变参数的身份似乎很奇怪。

问得好,我找不到说明为什么 invoke 将参数包装为 Rake::TaskArgumentsexecute 不包装的原因。

executeinvoke 调用以完成任务的工作,此时参数已经包装到 Rake::TaskArguments 实例中。这就是为什么在 "normal" 用法中你会在任务中得到 Rake::TaskArguments。我会说正常用法是在命令行上指定任务或作为依赖项。在这些情况下,您将通过 invoke 在 rake 本身中调用任务。

为了确保任务中的参数始终是一个 Rake::TaskArguments 实例,我想唯一的方法是在您自己的代码中使用 execute 时包装参数。例如

Rake::Task['some_task'].execute(Rake::TaskArguments.new(argument_names, [arg1, arg2]))

argument_names 是必需的,是任务期望的参数名称。您实际上可以从任务本身 Rake::Task['some_task'].arg_names 中获得它。名称数组中的参数位置需要与命名参数值中的位置相匹配。

可能值得向佣金团队提出您的问题:https://github.com/ruby/rake/issues