2011-04-14 16 views
16

कमांड लाइन पर थोर कमांड को कॉल करते समय, नामों को उनके मॉड्यूल/क्लास स्ट्रक्चर द्वारा नामित किया गया है, उदाहरण के लिए नामांकनस्टैंडअलोन रूबी निष्पादन योग्य

class App < Thor 
    desc 'hello', 'prints hello' 
    def hello 
    puts 'hello' 
    end 
end 

कमांड के साथ चलाया जाएगा

thor app:hello 

हालांकि, अगर आप आप की तरह आदेश चला सकते हैं तल पर

App.start 

रख कर कि स्वयं निष्पादन योग्य बनाने:

app hello 

क्या एन के लिए कोई रास्ता है उन आदेशों का पालन करें?

#!/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 

भी आदर्श नहीं या,:: तो है कि आप उदाहरण के लिए, कह सकते हैं

app say:hello 
app say:goodbye 

उत्तर

23

ऐसा करने का एक और तरीका रजिस्टर का उपयोग करना है:

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 

वर्तमान थोर संस्करण में (0.15.0.rc2) वहाँ एक बग हालांकि, जिनमें से नाम स्थान को छोड़ने के लिए मदद ग्रंथों का कारण बनता है उप आदेश:

$ foo sub 
Tasks: 
    foo help [COMMAND] # Describe subcommands or one specific subcommand 
    foo bar    # 

आप स्वयं को स्कैनर को ओवरराइड करके और नामस्थान को स्पष्ट रूप से सेट करके ठीक कर सकते हैं।

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 का दूसरा पैरामीटर बैनर के मूल implemtation के लिए एक ही अंतर है। आप इसे एक बार भी कर सकते हैं और अन्य उप कमांड थोर क्लास सबटास्क से प्राप्त कर सकते हैं। अब आप प्राप्त करते हैं:

$ foo sub 
Tasks: 
    foo sub help [COMMAND] # Describe subcommands or one specific subcommand 
    foo sub bar    # 

आशा है कि मदद करता है।

+1

पवित्र बकवास! आप मेरे जीवन के 8 घंटे पहले कहाँ थे? सुरुचिपूर्ण समाधान के लिए धन्यवाद। – elmt

+0

यह मेरे लिए काम नहीं करता था (thor 0.18.1) लेकिन https://github.com/wycats/thor/issues/261#issuecomment-16880836 पर वर्णित एक समान काम काम किया –

5

यह डिफ़ॉल्ट नाम स्थान के रूप में App के साथ एक ही रास्ता (काफी hacky हालांकि) है

define_method 'say:hello' 
+0

तो ऐसा करने के लिए कोई साफ तरीका नहीं है? यह अभी समर्थित नहीं है? – rubiii

+0

मैं निश्चित रूप से नहीं कह सकता। मैंने एक साफ रास्ता खोजने की कोशिश की और असफल रहा। मुझे लगता है कि नामस्थान विधि केवल स्टैंडअलोन निष्पादन योग्य के बजाय थोर कमांड का उपयोग करते समय काम करती है। –

संबंधित मुद्दे