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

时间:2011-09-01 23:05:17

标签: ruby thor

thor wiki页面Making an Exectable向您展示了如何创建一个类似于此的Thor驱动的CLI命令:

bash ./mythorcommand foo

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

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

bash ./mythorcommand

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

bash ./mythorcommand "somevalue"

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

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

class MyThorCommand < Thor
  only_method :default

  def default(*args)
    puts args.inpsect
  end 
end 

MyThorCommand.start

3 个答案:

答案 0 :(得分:4)

您应该从Thor :: Group扩展并调用start start方法

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

Test.start

答案 1 :(得分:2)

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

您向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”]'作为结果。

希望它有所帮助。

答案 2 :(得分:1)

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

map '-F' => 'foo'

现在你也可以传递参数

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