Thor 1.2.1三级子命令帮助信息显示异常问题求助
Thor 1.2.1三级子命令帮助信息父命令缺失问题
结论
这是Thor 1.2.1的已知bug,并非你的操作有误。在三级及更深层级的子命令帮助输出中,中间父命令会被遗漏,导致命令路径显示不完整。
问题复现
你的代码完全遵循Thor子命令的定义规范:
#! /usr/bin/env ruby require "thor" module SubCommand2 class Cli < Thor desc "hello NAME", "say hello to NAME" def hello(name) puts "Hello #{name}" end end end module SubCommand1 class Cli < Thor desc "hello NAME", "say hello to NAME" def hello(name) puts "Hello #{name}" end desc "subcommand2 [COMMAND]", "SubCommand2 Project Commands" long_desc "SubCommand2 Commands" subcommand "subcommand2", SubCommand2::Cli end end module Demo class Cli < Thor desc "hello NAME", "say hello to NAME" def hello(name) puts "Hello #{name}" end desc "subcommand1 [COMMAND]", "SubCommand1 Project Commands" long_desc "SubCommand1 Commands" subcommand "subcommand1", SubCommand1::Cli end end Demo::Cli.start(ARGV)
执行命令 ./demo subcommand1 subcommand2 后,实际输出的帮助信息丢失了中间层级subcommand1:
#> ./demo subcommand1 subcommand2 Commands: demo subcommand2 hello NAME # say hello to NAME demo subcommand2 help [COMMAND] # Describe subcommands or one specific subcommand
而期望的正确输出应包含完整的命令路径:
#> ./demo subcommand1 subcommand2 Commands: demo subcommand1 subcommand2 hello NAME # say hello to NAME demo subcommand1 subcommand2 help [COMMAND] # Describe subcommands or one specific subcommand
问题原因
Thor 1.2.1在生成嵌套子命令的帮助信息时,命令路径的拼接逻辑存在缺陷,仅保留了根命令和当前直接子命令的名称,没有递归拼接所有父级子命令的名称,导致中间层级丢失。
解决方案
- 升级Thor版本:该问题在Thor 1.3.0及后续版本中已被修复,执行以下命令升级即可解决:
gem update thor - 临时兼容方案(无法升级时):通过重写子命令类的
banner方法,手动拼接完整命令路径。例如在SubCommand2::Cli中添加:
注意这种方式需要为每个深层子命令单独适配,通用性有限,建议优先选择版本升级。def self.banner(command, _namespace = nil, _subcommand = false) full_path = "#{Demo::Cli.banner_base} subcommand1 subcommand2 #{command.name}" full_path.gsub(/\s+/, ' ') end
内容的提问来源于stack exchange,提问作者QOps1981
相关产品推荐
相关产品推荐

