[英]Namespacing thor commands in a standalone ruby executable
在命令行上調用thor命令時,這些方法按其模塊/類結構命名,例如
class App < Thor
desc 'hello', 'prints hello'
def hello
puts 'hello'
end
end
將使用該命令運行
thor app:hello
但是,如果你通過推桿使自己可執行
App.start
在底部你可以運行如下命令:
app hello
有沒有辦法命名這些命令? 例如,你可以打電話
app say:hello
app say:goodbye
另一種方法是使用寄存器:
class CLI < Thor
register(SubTask, 'sub', 'sub <command>', 'Description.')
end
class SubTask < Thor
desc "bar", "..."
def bar()
# ...
end
end
CLI.start
現在 - 假設您的可執行文件名為foo - 您可以調用:
$ foo sub bar
在當前的thor版本(0.15.0.rc2)中存在一個錯誤,導致幫助文本跳過子命令的命名空間:
$ foo sub
Tasks:
foo help [COMMAND] # Describe subcommands or one specific subcommand
foo bar #
您可以通過重寫self.banner並顯式設置命名空間來解決此問題。
class SubTask < Thor
namespace :sub
def bar ...
def self.banner(task, namespace = true, subcommand = false)
"#{basename} #{task.formatted_usage(self, true, subcommand)}"
end
end
formatted_usage的第二個參數是banner原始實現的唯一區別。 您也可以執行此操作,並從SubTask繼承其他子命令Thor類。 現在你得到:
$ foo sub
Tasks:
foo sub help [COMMAND] # Describe subcommands or one specific subcommand
foo sub bar #
希望有所幫助。
這是App作為默認命名空間的一種方式(雖然非常hacky):
#!/usr/bin/env ruby
require "rubygems"
require "thor"
class Say < Thor
# ./app say:hello
desc 'hello', 'prints hello'
def hello
puts 'hello'
end
end
class App < Thor
# ./app nothing
desc 'nothing', 'does nothing'
def nothing
puts 'doing nothing'
end
end
begin
parts = ARGV[0].split(':')
namespace = Kernel.const_get(parts[0].capitalize)
parts.shift
ARGV[0] = parts.join
namespace.start
rescue
App.start
end
或者,也不理想:
define_method 'say:hello'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.