Thor可执行文件 – 忽略任务名称

thor wiki页面, Making a Exectable ,向您展示如何创建一个类似于以下内容的Thor驱动的CLI命令:

bash ./mythorcommand foo

这要求您传入thor任务foo作为第一个参数。

我还可以使用thor的default_method运行一个没有任何参数的thor可执行文件:

bash ./mythorcommand

但是,我想传入一个变量字符串作为第一个参数:

bash ./mythorcommand "somevalue"

这不起作用,因为thor命令期望第一个参数是任务名称。 有没有办法忽略任务名称并将第一个参数发送到默认方法?

如果此function不存在,我认为添加一个将所有命令行参数传递到一个任务/方法的方法非常有用:

 class MyThorCommand < Thor only_method :default def default(*args) puts args.inpsect end end MyThorCommand.start 

你应该从Thor :: Group和那个call start方法扩展

 class Test < Thor::Group desc "Act description" def act puts "do smth" end end Test.start 

我找到了一个相当“奇怪”的解决方案来解决这个问题。

您向Thor添加默认任务。 比你添加method_missing,以便你可以欺骗Thor将默认方法作为参数传递,如果你的应用程序有参数。

从您的示例中可以看出,解决方案如下所示:

 class MyThorCommand < Thor default_task :my_default desc "my_default", "A simple default" def my_default(*args) puts args.inspect end def method_missing(method, *args) args = ["my_default", method.to_s] + args MyThorCommand.start(args) end end MyThorCommand.start(ARGV) 

如果这是在文件“my_thor.rb”中,执行“ruby my_thor.rb foo bar”将显示'[“foo”,“bar”]'作为结果。

希望能帮助到你。

虽然这并不能完全解决您的问题,但是一种替代方法可能是使用Thor.map通过仅提供选项标志来调用命令:

 map '-F' => 'foo' 

现在您也可以传递参数

 mythorcommand -F bar # => invokes foo("bar")