Подкоманда с переносом в Thor

#ruby #thor

#рубиновый #thor

Вопрос:

Я пишу CLI gem с помощью Thor. Прямо сейчас у меня есть две подкоманды с именами, которые я хотел бы написать через дефис. Но я не могу понять, как заставить это работать.

Вот основной класс

 module CLI
  class Base < Thor

    desc "api-token COMMAND", "Configure the API token"
    subcommand "api-token", ApiToken
 

Вот класс подкоманды

 module CLI
  class ApiToken < Thor
    include Shared

    namespace "api-token"
 

Подкоманда отображается в основном help выводе, и если я введу

 $ bundle exec bin/cli help api-token
 

он показывает мне правильный вывод для действий подкоманд. Так что, по крайней мере, что-то подключается.

Но когда я пытаюсь использовать команду, это то, что я вижу

 $ bundle exec bin/cli api-token set
> Could not find command "api-token".
 

Команда отлично работает, если я делаю это одним словом или использую подчеркивание, но я действительно предпочитаю дефис.

Комментарии:

1. Вы нашли решение этой проблемы? Я застрял с той же проблемой

2. Нет. Я отказался от попыток разобраться в этом. Тем не менее, я бы все равно хотел это изменить.

Ответ №1:

Там нет map ничего обязательного, просто

 class Test < Thor
  desc 'howto-dash', "dash in command name"
  def howto_dash
    puts "dashing through the snow"
  end
end
 

Выходной сигнал:

 > thor list
test
----
thor test:howto-dash  # dash in command name
 

Комментарии:

1. Наконец-то возвращаюсь к этому ответу. Меня бесит, насколько это было просто, столько времени я потратил на это.

2. Я обнаружил, что thor это всегда преобразует тире в символы подчеркивания перед вызовом метода; и вы можете предоставить все desc , что захотите.

Ответ №2:

На случай, если кому-то это интересно, вы можете использовать Thor.map для сопоставления строки с методом / command. Ex.

 desc "Command help", "Longer command description"
def package_all
  puts "Packing..."
end
map "package-all" => "package_all"
 

Ссылка на документацию: Thor#map-class_method