Добавление опции -version в CLI Ruby Thor

Как добавить параметр --version в мое приложение интерфейса командной строки Ruby Thor.

Например, я хочу иметь возможность запускать

$ thor_app --version
> thor_app version 1.0.0

Этот вопрос связан с Запуск приложения CLI Thor без аргументов или имени задачи, но специально для добавления опции --version, которая не требует задачи.

Примечание
Это было написано в формате автоответчика. Рекомендуются дополнительные ответы и обновления.

Ответ 1

Мне повезло с таким подходом:

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 --version или yourapp -v. Содержимое desc позволит ему отображаться как -v, --version без отображения __print_version.

Ответ 2

До сих пор лучшим вариантом, который я придумал, является создание опции boolean class, которая не относится к задаче, на которую могут ссылаться другие задачи. Часто используемым примером для параметра класса является -v verbose, так как все задачи могут использовать это, чтобы определить, насколько они должны быть шумными.

Затем создайте задачу "версия" и сделайте ее заданием по умолчанию, поэтому, когда задача не определена, задача версии запускается и может реагировать на флаг -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

Ответ 3

Мне не понравилось принятое решение; он заканчивает перечисление version в качестве команды, перечисляя --version и --no-version в качестве глобальных параметров, а если script запущен без параметров, он молчит, а не дает справку.

Лучшее, что я смог придумать, это сделать это за пределами Тора:

class CLI < Thor
   .
   .
   .
end

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

CLI.start

У этого есть незначительный недостаток, который --version нигде не документирован.