2013-06-21 34 views
8

Tôi mới sử dụng Thor (và Ruby) và tôi đang xem xét sử dụng nó trong một tập lệnh xây dựng, vì nó được cho là có thể thay thế cho Rake (do đó tạo ra). Tuy nhiên sau một thử nghiệm ngắn, tôi bị nhầm lẫn về trạng thái lỗi mà nó trả về. Tôi đã nhanh chóng đi qua wiki nhưng chưa thấy bất kỳ đề cập nào về điều đó.Trạng thái thoát Ruby/Thor trong trường hợp lỗi

Với chỉ là người đầu tiên "Ví dụ đơn giản", test.thor:

class Test < Thor 
    desc "example", "an example task" 
    def example 
    puts "I'm a thor task!" 
    end 
end 

phiên bản #:

eruve>thor version 
Thor 0.18.1 

Tôi đã thử các sau đây, một lệnh sai lầm về mục đích:

eruve>ruby --version; thor test:example badarg; echo exit status: $? 

ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin10.8.0] 
ERROR: thor example was called with arguments ["badarg"] 
Usage: "thor test:example". 
exit status: 0 

Vì vậy, đã có một lỗi nhưng nó thoát với tình trạng 0 dù sao ... có nghĩa là tôi không muốn sử dụng nó trong một (n on-ruby) script, nếu không script sẽ tiếp tục chạy mặc dù nó sẽ kết thúc. Các lỗi tiếp theo có thể khó phân tích.

tôi phải mất một cái gì đó, vì thế câu hỏi của tôi:

  • Có một cách dễ dàng để có được một tình trạng khác không theo mặc định trong trường hợp có lỗi (tập tin cấu hình, vv)?

  • Nếu không, tôi phải làm gì để làm đúng?

Cảm ơn bạn.

Trả lời

2

Dựa trên giải pháp bundler của (nhiều nhờ @fontno), và điều tra thêm về bên cạnh tôi, đây là một hack để có nó hoạt động với một shell bình thường. CẢNH BÁO: nó không thanh lịch, in ra ngoại lệ ngăn xếp crap, nhưng tôi nghĩ rằng các công trình (xin vui lòng không ngần ngại cho tôi biết nếu không).

class Thorough < Thor 
    ENV["THOR_DEBUG"] = "1" 
    check_unknown_options! 
private 
    def subcommand(*_) super subcommand(*_) 
    rescue Thor::Error => e 
    $stderr.puts e.message 
    exit 1 
    end 
end 

class Test < Thor#ough 
    desc "example", "an example task" 
    def example 
    puts "I'm a thor task!" 
    end 
end 

Được viết như trên, nó có hành vi tương tự như trước (tôi tin). Bây giờ, sau khi xóa # từ Thor#ough, nó sẽ thoát với trạng thái 1 nếu Thor đã tăng Error, do đó cho phép một số điều khiển từ ví dụ: một vỏ không ruby.

eruve>thor test:example badarg; echo $? 
/Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/base.rb:482:in `handle_argument_error': ERROR: thor example was called with arguments ["badarg"] (Thor::InvocationError) 
Usage: "thor test:example". 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/command.rb:35:in `rescue in run' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/command.rb:21:in `run' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/base.rb:439:in `start' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/runner.rb:36:in `method_missing' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/command.rb:29:in `run' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/command.rb:128:in `run' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/base.rb:439:in `start' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/bin/thor:6:in `<top (required)>' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/bin/thor:23:in `load' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/bin/thor:23:in `<main>' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/bin/ruby_noexec_wrapper:14:in `eval' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/bin/ruby_noexec_wrapper:14:in `<main>' 
1 

eruve>thor test:example; echo $? 
I'm a thor task! 
0 

eruve>thor test:example badarg 2>/dev/null; echo $? 
1 

Chúc mừng. PS: Tôi tự hỏi, có rất nhiều gotchas như thế này trong Thor? Nếu đó là một hành vi mong đợi, mục đích/triết lý của nó không tương thích với nhu cầu của dự án của tôi ... hack không phải là một giải pháp đáng tin cậy.

1

Câu hỏi hay. Tôi cũng nhận thấy điều này khi tìm kiếm một thor để sử dụng cho một dự án. Theo như tôi có thể nói đây là hành vi mong đợi. Điều này pull request for bundler có một giải pháp thú vị có thể thích hợp cho bạn.

Họ bật cờ thor debug để họ có thể bắt lỗi và thiết lập trạng thái thoát thích hợp

# bin/bundle 

Bundler.with_friendly_errors { 
    # Set debug flag so we can rescue Thor::error's 
    # and set the correct exit code. 
    ENV["THOR_DEBUG"] = "1" 
    Bundler::CLI.start 
} 


# friendly_errors 

rescue Thor::UndefinedCommandError => e 
    Bundler.ui.error e.message 
    exit 15 
    rescue Thor::Error => e 
    Bundler.ui.error e.message 
    exit 1 
+0

+1 bởi vì nó dẫn đến hack (xem câu trả lời của tôi), mặc dù không trực tiếp sử dụng được, cụ thể là giải pháp bên ngoài Ruby. – eruve

18

Tôi biết điều này đã được trả lời nhưng tôi nghĩ đây là câu trả lời hay hơn vì vậy tôi nghĩ tôi sẽ đóng góp nó.

Thor có một phương pháp bạn có thể sử dụng để thay đổi hành vi để các lỗi gây ra các mã thoát khác không. Nó không được ghi chép rất rõ (IMHO).

class Test < Thor 
    def self.exit_on_failure? 
    true 
    end 

    desc "example", "an example task" 
    def example 
    puts "I'm a thor task!" 
    end 
end 

Giá trị mặc định cho điều này là không thể giải thích false. Tôi không biết tại sao ai đó lại muốn nó cư xử như thế. Thor issue 244 cũng giải quyết vấn đề này.

+0

Đây phải là câu trả lời được chấp nhận –

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