Thor - 方法中无法识别命令行选项

Thor - command line option not recognized in method

我必须对 运行 我的 ruby 程序使用此命令:

$ruby filename.rb NAME --from="People" --yell

我有这样的脚本:

require 'thor'

class CLI < Thor
  desc "hello NAME", "say hello to NAME"

  method_option :from, :required => true
  method_option :yell, :type => :boolean
  def self.hello(name)
    output = []
    output << "from: #{options[:from]}" if options[:from]
    output << "Hello #{name}"
    output = output.join("\n")
    puts options[:yell] ? output.upcase : output
  end
end

CLI.hello(ARGV)

当我 运行 代码时,我得到以下输出:

c:\RubyWorkplace\Assignment1>ruby testing.rb Jay --from="Ray"
FROM: #<THOR::OPTION:0X000000031D7998>
HELLO ["JAY", "--FROM=RAY"]

c:\RubyWorkplace\Assignment1>ruby testing.rb Jay --from="Ray" --yell
FROM: #<THOR::OPTION:0X0000000321E528>
HELLO ["JAY", "--FROM=RAY", "--YELL"]

不管我指定与否,:yell似乎总是有效,而optionshello方法中都被读取为name输入。

从网上的教程中找了很多方法也试了很多方法都没有解决问题。请告诉我出了什么问题。谢谢!

问题是我在脚本中调用CLI.hello ARGV引起的。程序运行时会调用hello方法,并将所有命令行输入识别为hello的参数,是一个数组。

解决此问题的方法之一是通过删除 self 使 hello public,通过 start 方法调用脚本。

require 'thor'

class CLI < Thor
  desc "hello NAME", "say hello to NAME"

  method_option :from, :required => true
  method_option :yell, :type => :boolean
  def hello(name)
    #do something
  end
end

CLI.start ARGV