簡體   English   中英

命名空間Thor命令在獨立的ruby可執行文件中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM