Добавление опции -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
нигде не документирован.