在Ruby Thor CLI中添加--version选项

时间:2014-04-02 11:28:53

标签: ruby thor

如何在我的Ruby Thor命令行界面应用程序中添加--version选项。

例如,我希望能够运行

$ thor_app --version
> thor_app version 1.0.0

此问题与Run a CLI Thor app without arguments or task name有关,但专门用于添加不需要任务的--version选项。

注意
这是在self-answer format之后写的。鼓励添加答案和更新

3 个答案:

答案 0 :(得分:28)

我对这种方法感到非常幸运:

class CLI < Thor
  map %w[--version -v] => :__print_version

  desc "--version, -v", "print the version"
  def __print_version
    puts FooBar::VERSION
  end
end

前导下划线确保没有yourapp version之类的命令,并强制yourapp --versionyourapp -vdesc内容允许其显示为-v, --version而不会泄露__print_version

答案 1 :(得分:1)

到目前为止,我提出的最佳选择是创建一个布尔类选项,该选项不属于任务,可以由其他任务引用。类选项的常用示例是-v详细,因为所有任务都可以使用它来确定它们应该是多么嘈杂。

然后创建一个'版本'任务并使其成为默认任务,因此当没有定义任务时,版本任务就会运行并且可以对--version标志(类选项)作出反应。

class CLI < Thor
  #include Thor::Actions
  class_option :version, :type => :boolean

  desc "version", "Show thor_app version"
  def version
    if options[:version]
      puts "thor_app version #{find_version}"
    end
  end
  default_task :version

  no_tasks do
    def find_version
      ## Method can be replaced to look up VERSION
      '1.0.0'
    end
  end
end

答案 2 :(得分:1)

我不喜欢公认的解决方案;它最终列出version作为命令,列出--version--no-version作为全局选项,如果脚本没有选项运行,则它是静默的而不是提供帮助。

我能想到的最好的就是在雷神之外做到这一点:

class CLI < Thor
   .
   .
   .
end

if ARGV[0] == "--version"
    puts "MyApp #{MyApp::VERSION}"
    exit
end

CLI.start

这有一个小缺点,即--version没有记录在任何地方。