为什么当任务是 运行 时使用 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::TaskArguments
而 execute
不包装的原因。
execute
从 invoke
调用以完成任务的工作,此时参数已经包装到 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
在 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::TaskArguments
而 execute
不包装的原因。
execute
从 invoke
调用以完成任务的工作,此时参数已经包装到 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