2013-06-21 3 views
8

के मामले में रूबी/थोर निकास स्थिति मैं थोर (और रूबी के लिए) के लिए नया हूं और मैं इसे बिल्ड स्क्रिप्ट के भीतर उपयोग करने पर विचार कर रहा हूं, क्योंकि ऐसा कहा जाता है कि यह रेक के प्रतिस्थापन हो सकता है (इस प्रकार मेक)। हालांकि एक छोटे से परीक्षण के बाद, मैं लौटने वाली त्रुटि स्थिति के बारे में उलझन में हूं। मैं जल्दी से विकी के माध्यम से चला गया लेकिन इसके बारे में कोई उल्लेख नहीं देखा है।त्रुटि

सिर्फ पहला "सरल उदाहरण" के साथ

, test.thor:

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

संस्करण #:

eruve>thor version 
Thor 0.18.1 

मैंने कोशिश उद्देश्य पर निम्नलिखित, एक गलत आदेश:

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 

तो, एक त्रुटि हुई लेकिन यह स्थिति 0 के साथ बाहर निकलती है ... जिसका अर्थ है कि मैं इसे एक (एन ऑन-रूबी) स्क्रिप्ट, या अन्यथा स्क्रिप्ट जारी रहेगी, भले ही इसे समाप्त कर दिया जाए। बाद की त्रुटियों का विश्लेषण करना मुश्किल हो सकता है।

मैं अपने सवालों के कुछ कमी की जानी चाहिए, इसलिए:

  • वहाँ एक आसान तरीका एक त्रुटि के मामले में डिफ़ॉल्ट रूप से एक गैर शून्य स्थिति पाने के लिए है (कॉन्फ़िग फ़ाइल, आदि)?

  • यदि नहीं, तो मुझे यह सही करने के लिए क्या करना चाहिए?

धन्यवाद।

उत्तर

2

बंडलर के समाधान के आधार पर, और, यहाँ एक है इसे सामान्य खोल के साथ काम करने के लिए हैक करें। चेतावनी: यह सुरुचिपूर्ण नहीं है, अपवाद स्टैक बकवास प्रिंट करता है, लेकिन मुझे लगता है कि काम करता है (कृपया मुझे अन्यथा बताने में संकोच न करें)।

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 

ऊपर के रूप में लिखा है, यह पहले की तरह (मेरा मानना ​​है कि) एक ही व्यवहार किया है। अब, Thor#ough से # को हटाने के बाद, अगर थोर ने Error उठाया है, तो इसे स्थिति 1 से बाहर निकलना चाहिए, इस प्रकार कुछ नियंत्रण से उदा। एक गैर रूबी खोल।

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 

चीयर्स। पीएस: मुझे आश्चर्य है, क्या थोर में इस तरह के कई मिलचास हैं? यदि यह एक अपेक्षित व्यवहार है, तो इसका उद्देश्य/दर्शन मेरे प्रोजेक्ट की ज़रूरतों के अनुरूप है ... हैक विश्वसनीय समाधान नहीं हैं।

1

अच्छा सवाल। प्रोजेक्ट के लिए उपयोग करने के लिए thor को देखते समय मैंने यह भी देखा। जहां तक ​​मैं यह कह सकता हूं कि व्यवहार की उम्मीद है। यह pull request for bundler एक दिलचस्प समाधान है जो आपके लिए उपयुक्त हो सकता है।

वे थोर डिबग ध्वज सक्षम तो वे (बहुत धन्यवाद @fontno) मेरी तरफ के बारे में अधिक जांच त्रुटि को पकड़ सकता है और सेट उचित बाहर निकलें स्थिति

# 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 क्योंकि यह एक हैक (मेरा जवाब देखें) का नेतृत्व किया, हालांकि यह सीधे उपयोग करने योग्य नहीं है, विशेष रूप से रूबी के बाहर एक समाधान के रूप में। – eruve

18

मुझे पता है कि यह पहले से ही उत्तर दिया गया है लेकिन मुझे लगता है कि यह एक बेहतर जवाब है इसलिए मैंने सोचा कि मैं इसे वैसे भी योगदान दूंगा।

थोर का एक तरीका है जिसका उपयोग आप व्यवहार को बदलने के लिए कर सकते हैं ताकि त्रुटियां गैर-शून्य निकास कोड का कारण बन सकें। यह बहुत अच्छी तरह से प्रलेखित नहीं है (आईएमएचओ)।

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 

इसके लिए डिफ़ॉल्ट false है। मुझे नहीं पता कि कोई भी व्यक्तिगत रूप से ऐसा व्यवहार क्यों करेगा। Thor issue 244 इसे भी संबोधित करता है।

+0

यह स्वीकार्य उत्तर होना चाहिए –

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