2012-02-18 20 views
5

Câu hỏi này bắt đầu từ here. Nhưng thay đổi đáng kể khi tôi học được nhiều hơn về Thor.Làm cách nào để đăng ký một Thor :: Nhóm dưới dạng tiểu ban với các đối số

Tôi đang cố gắng tạo nhóm phụ :: Nhóm con để tranh luận. Kỳ lạ thay, nó hoạt động nếu không có đối số.

Tôi có thể sử dụng Thor :: Nhóm làm lệnh phụ không?

này hoạt động khi tôi gõ: foo counter

foo/bin/foo

module Foo 
    class CLI < Thor 
    register(Counter, 'counter', 'counter', 'Count up from the 1.') 
    end 

    class Counter < Thor::Group 
    desc "Prints 1 2" 

    def one 
     puts 1 
    end 

    def two 
     puts 2 
    end 

    end 

end 

Foo::CLI.start 

Nhưng điều này không hoạt động khi tôi gõ: foo counter 5

module Foo 
    class CLI < Thor 
    register(Counter, 'counter', 'counter <number>', 'Count up from the input.') 
    end 

    class Counter < Thor::Group 
    argument :number, :type => :numeric, :desc => "The number to start counting" 
    desc "Prints 2 numbers based on input" 

    def one 
     puts number + 0 
    end 

    def two 
     puts number + 1 
    end 

    end 


end 

Foo::CLI.start 

Nó trả lời: counter was called incorrectly. Call as foo counter number

Trả lời

3

Tôi có một giải pháp. Thay vì sử dụng Thor :: Nhóm Tôi đang sử dụng lời gọi

bin/foo trông như thế này:

#!/usr/bin/env ruby 

require 'foo' 

Foo::CLI.start 

lib/cli.rb - thanh ghi 'tạo' như công việc phụ của các lệnh cơ bản, foo :

module Foo 
    class CLI < Thor 
    register(Generate, 'generate', 'generate [something]', 'Type foo generate for more help.') 
    end 
end 

lib/generate.rb trông như thế này:

module Foo 

    class Generate < Thor 

    desc "project [name]", "Prints the project making step" 
    def project(name) 
     puts "making first project file #{name}" 
     invoke :config 
     invoke :project_sub 
    end 

    desc "config [name]", "Prints the config making step" 
    def config(name) 
     puts "making first config file #{name}" 
     invoke :project_sub 
    end 

    desc "project_sub [name]", "Prints the project_sub making step" 
    def project_sub(name) 
     puts "making subsystem file #{name}" 
    end 

    def self.banner(task, namespace = false, subcommand = true) 
     task.formatted_usage(self, true, subcommand).split(':').join(' ') 
    end 

    end 

end 

Bây giờ tôi có thể gõ: foo generate project fred

và nó sẽ ra:

> making first project file fred 
> making first config file fred 
> making subsystem file fred 

Thông báo các biểu ngữ ghi đè. Nó có nghĩa là gõ: foo generate project với args hợp lệ hoặc thiếu sẽ cung cấp cho các thông báo trợ giúp đúng:

"project" was called incorrectly. Call as "foo generate project [name]". 

như trái ngược với

"project" was called incorrectly. Call as "foo project [name]". 
Các vấn đề liên quan