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
答案 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")