2011-09-01 40 views
10

雷神wiki页面,Making an Exectable,向您展示如何创建一个雷神供电CLI命令看起来是这样的:雷神可执行文件 - 忽略任务名称

bash ./mythorcommand foo

这需要你在雷神任务传递第一个参数是foo

我也可以用雷神之default_method运行不带任何参数雷神可执行文件:

bash ./mythorcommand

不过,我想在一个变量字符串作为第一个参数传递:

bash ./mythorcommand "somevalue"

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

如果此功能不存在,我认为这将是非常有益的补充,将通过所有的命令行参数到一个任务/方法的方法:

class MyThorCommand < Thor 
    only_method :default 

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

MyThorCommand.start 

回答

1

虽然这并不完全解决您的问题,一个替代方法可能是使用Thor.map只给一个选项标志来调用命令:

map '-F' => 'foo' 

现在你也可以传递参数

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

你应该从托尔::集团延伸并且调用start方法

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

Test.start 
+0

这个答案是正确的。使用'argument:bar'通过调用#act内的'bar'来使得未命名的字符串参数的内容可用。 Thor会在'class_options'定义的选项之前或之后找到这个参数。 –

+3

请注意Thor :: Group一次调用所有任务。 – FuePi

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”执行“红宝石my_thor.rb富巴”会显示“[“富“,”酒吧“]作为结果。

希望它有帮助。