开发者

Thor Executable - Ignore Task Name

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 MyThorCo开发者_如何学Gommand < Thor
  only_method :default

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

MyThorCommand.start


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


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.


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")
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜