2011-09-01 25 views
10

Các trang wiki thor, Making an Exectable, cho bạn thấy làm thế nào để tạo ra một thor powered lệnh CLI mà trông giống như sau:Thor Executable - Bỏ qua công tác Tên

bash ./mythorcommand foo

này đòi hỏi bạn phải vượt qua trong nhiệm vụ thor foo làm đối số đầu tiên.

tôi cũng có thể chạy một thực thi thor mà không cần bất kỳ đối số sử dụng thor của default_method:

bash ./mythorcommand

Tuy nhiên, tôi muốn vượt qua trong một chuỗi biến như là đối số đầu tiên:

bash ./mythorcommand "somevalue"

Điều này không hiệu quả vì lệnh thor mong đợi đối số đầu tiên là tên công việc. Có cách nào để bỏ qua tên tác vụ và gửi đối số đầu tiên cho một phương thức mặc định không?

Nếu chức năng này không tồn tại, tôi nghĩ nó sẽ rất hữu ích để thêm một phương pháp mà sẽ vượt qua tất cả các đối số dòng lệnh vào một nhiệm vụ/phương pháp:

class MyThorCommand < Thor 
    only_method :default 

    def default(*args) 
    puts args.inpsect 
    end 
end 

MyThorCommand.start 

Trả lời

1

Mặc dù điều này không chính xác giải quyết vấn đề của bạn , một trong những lựa chọn có thể được sử dụng Thor.map để gọi một lệnh bằng cách chỉ đưa ra một lá cờ tùy chọn:

map '-F' => 'foo' 

Bây giờ bạn cũng có thể vượt qua các thông số

mythorcommand -F bar # => invokes foo("bar") 
4

Bạn nên mở rộng từ Thor :: Nhóm và bắt đầu cuộc gọi phương thức

class Test < Thor::Group 
    desc "Act description" 
    def act 
    puts "do smth" 
    end 
end 

Test.start 
+0

Câu trả lời này là chính xác. Sử dụng 'argument: bar' để làm cho nội dung của đối số chuỗi chưa đặt tên có sẵn bằng cách gọi' bar' bên trong '# action'. Thor sẽ tìm đối số này cho dù đó là trước hoặc sau bất kỳ tùy chọn nào được xác định bởi 'class_options'. –

+3

Hãy coi chừng Thor :: Nhóm gọi tất cả các tác vụ cùng một lúc. – FuePi

2

Tôi tìm thấy một giải pháp chứ không phải 'lạ' cho vấn đề này đó là làm việc khá tốt với tôi.

Bạn thêm tác vụ mặc định vào Thor. Hơn bạn thêm method_missing để bạn có thể đánh lừa Thor để chuyển phương thức mặc định làm đối số nếu có các tham số cho ứng dụng của bạn.

Lấy từ ví dụ của bạn, giải pháp sẽ trông như thế này:

class MyThorCommand < Thor 
    default_task :my_default 

    desc "my_default", "A simple default" 
    def my_default(*args) 
    puts args.inspect 
    end 

    def method_missing(method, *args) 
    args = ["my_default", method.to_s] + args 
    MyThorCommand.start(args) 
    end 

end 

MyThorCommand.start(ARGV) 

Nếu đây là trong file "my_thor.rb" một thực hiện "ruby my_thor.rb foo bar" sẽ hiển thị '[ "foo "," bar "] 'là kết quả.

Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan