Thor Executable - Ignore Task Name

心不动则不痛 提交于 2019-12-04 18:42:21

问题


The thor wiki page, Making an Exectable, shows you how to create a thor powered CLI command that looks something like this:

bash ./mythorcommand foo

This requires you to pass in the thor task foo as the first argument.

I can also run a thor executable without any arguments using thor's default_method:

bash ./mythorcommand

However, I'd like to pass in a variable string as the first argument:

bash ./mythorcommand "somevalue"

This doesn't work because thor commands expect the first argument to the be a task name. Is there a way to ignore the task name and send the first argument to a default method?

If this functionality doesn't exist, I think it would be very useful to add a method that would pass all commandline arguments into one task/method:

class MyThorCommand < Thor
  only_method :default

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

MyThorCommand.start

回答1:


You should extend from Thor::Group and that call start method

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

Test.start



回答2:


I found a rather 'strange' solution for this problem that is working quite well with me.

You add a default task to Thor. Than you add the method_missing so that you can trick Thor into passing the default method as an argument if there are parameters to your application.

Taking from your example, the solution would look like this:

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)

If this is in the file "my_thor.rb" an execution "ruby my_thor.rb foo bar" would show '["foo", "bar"]' as a result.

Hope it helps.




回答3:


Though this does not exactly solve your problem, one alternative might be using Thor.map to invoke a command by only giving an option flag:

map '-F' => 'foo'

Now you can also pass parameters

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


来源:https://stackoverflow.com/questions/7277604/thor-executable-ignore-task-name

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!