2014-04-02 13 views
10

Làm cách nào để thêm tùy chọn --version vào ứng dụng giao diện dòng lệnh Ruby Thor của tôi.Thêm tùy chọn --phiên bản vào Ruby Thor CLI

Ví dụ tôi muốn để có thể chạy

$ thor_app --version 
> thor_app version 1.0.0 

Câu hỏi này có liên quan đến Run a CLI Thor app without arguments or task name, nhưng đặc biệt để thêm một lựa chọn --version mà không đòi hỏi một nhiệm vụ.

Lưu ý
Điều này được viết sau self-answer format. Các câu trả lời bổ sung và cập nhật được khuyến khích

Trả lời

23

tôi đã có một số may mắn với cách tiếp cận này:

class CLI < Thor 
    map %w[--version -v] => :__print_version 

    desc "--version, -v", "print the version" 
    def __print_version 
    puts FooBar::VERSION 
    end 
end 

Các dấu gạch hàng đầu đảm bảo không có một lệnh như yourapp version, và các lực lượng yourapp --version hoặc yourapp -v. Nội dung desc sẽ cho phép hiển thị là -v, --version mà không hiển thị __print_version.

+0

Đây là loại trình bao. chỉ họ mới gọi phiên bản nhiệm vụ và để mọi người gọi nó bằng 'phiên bản bundler' nữa (vì tại sao không?) https://github.com/bundler/bundler/blob/6afa89217cf052c58316da1f2be7bf54749ff9de/lib/bundler/cli.rb#L312- L316 – ZombieDev

+2

Điều này sẽ được gửi lại cho Thor devs để sửa chữa tài liệu. –

1

Cho đến nay, tùy chọn tốt nhất mà tôi đã đưa ra là tạo tùy chọn lớp boolean, không thuộc về nhiệm vụ, có thể được tham chiếu bởi các tác vụ khác. Ví dụ thường được sử dụng cho một tùy chọn lớp là -v tiết, vì tất cả các tác vụ có thể sử dụng để xác định mức độ ồn ào của chúng.

Sau đó tạo tác vụ 'phiên bản' và đặt nhiệm vụ mặc định, vì vậy khi không có tác vụ nào được xác định, tác vụ phiên bản sẽ chạy và có thể phản ứng với cờ --version (tùy chọn lớp).

class CLI < Thor 
    #include Thor::Actions 
    class_option :version, :type => :boolean 

    desc "version", "Show thor_app version" 
    def version 
    if options[:version] 
     puts "thor_app version #{find_version}" 
    end 
    end 
    default_task :version 

    no_tasks do 
    def find_version 
     ## Method can be replaced to look up VERSION 
     '1.0.0' 
    end 
    end 
end 
0

Tôi không yêu giải pháp được chấp nhận; nó kết thúc bằng cách liệt kê version làm lệnh, liệt kê --version--no-version làm tùy chọn toàn cầu và nếu tập lệnh được chạy mà không có tùy chọn nào thì im lặng thay vì trợ giúp.

Điều tốt nhất tôi đã có thể đưa ra là để làm điều đó bên ngoài Thor:

class CLI < Thor 
    . 
    . 
    . 
end 

if ARGV[0] == "--version" 
    puts "MyApp #{MyApp::VERSION}" 
    exit 
end 

CLI.start 

này có nhược điểm nhỏ mà --version không ghi nhận bất cứ nơi nào.

+1

"Tôi không yêu giải pháp được chấp nhận" - chỉ dành cho hậu thế, điều này ban đầu được gọi là câu trả lời của Morgan (http://stackoverflow.com/a/22809973/528044). –

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