2012-12-05 17 views
11

मुझे gocheck का उपयोग करके परीक्षण चलाने में परेशानी हो रही है। मुझे यह निर्धारित करने के लिए एक ध्वज पास करने की आवश्यकता है कि कौन सा परीक्षण चलाना है, उदा। ।गोलांग विरोधाभासी कमांड लाइन झंडे

मेरी टेस्ट फ़ाइल एक सेटिंग पैकेज आयात करती है, जिसमें init() फ़ंक्शन है जो अपने स्वयं के झंडे निर्दिष्ट करता है और flag.parseFlags() पर कॉल करता है। मेरी समस्या यह है कि यह गोचेक झंडे को ओवरराइड करना प्रतीत होता है, इसलिए मुझे एक त्रुटि मिलती है कि ध्वज-gocheck.f पहचाना नहीं गया है।

नोट: सुनिश्चित नहीं हैं कि अगर यह प्रासंगिक है, लेकिन यह केवल मेरी संकुल के कुछ और नहीं दूसरों में होता है। मुझे लगता है कि यह सिर्फ आदेशों के आधार पर संकुल आयात करने का निर्णय लेता है, लेकिन मैंने सोचा कि अगर यह प्रासंगिक है तो मैं इसका उल्लेख करूंगा।

क्या कोई और इस समस्या में भाग लेता है? क्या सभी झंडे को गिरने के बिना गठबंधन करने के लिए एक आसान तरीका है, या मेरे कस्टम झंडे पर गोचेक झंडे को प्राथमिकता देने के लिए?

उत्तर

14

एक से अधिक पैकेज अन्य संकुल अन्य झंडे को परिभाषित तो आप मुसीबत में हैं (जैसा कि आप पहले से ही अनुभव किया है) के बारे में किसी भी चिंताओं के बिना flag.Parse कॉल करता है। "ध्वज" पैकेज की स्थिति एक वैश्विक स्थिति है, इसलिए यह अलग-अलग मानों के लिए init के दौरान वैश्विक चर के मान को सेट करने के लिए प्रतिस्पर्धा करने के लिए अलग-अलग पैकेज समान होगा। जाहिर है, यह ठीक से खत्म नहीं हो सकता है।

इसे रोकने के लिए आसान तरीका: flag.Parse केवल एक बार (पहली सन्निकटन में) बुलाया जाना चाहिए। यही कारण है कि यह आमतौर पर पैकेज "मुख्य" पैकेज में देखा जाता है। यदि आपका गैर-मुख्य पैकेज flag.Parse पर कॉल करता है तो यह आमतौर पर पैकेज "मुख्य" पैकेज में किसी भी flag.Parse के साथ संघर्ष करेगा। ध्यान दें कि go test आदेश में एक पैकेज का परीक्षण करने में एक package main संश्लेषित और flag.Parse कि संश्लेषित "मुख्य" पैकेज से कहा जाता है।

दूसरी तरफ, यह एक गैर-मुख्य पैकेज में झंडे को परिभाषित करने के लिए और अधिक "सुरक्षित" है (लेकिन विवाद संभव है) और flag.Parse पर भरोसा पैकेज "मुख्य" में कहा जाएगा। गैर-मुख्य पैकेज में, कोई यह सत्यापित कर सकता है कि flag.Parse को flag.Parsed() का उपयोग करके बुलाया गया है।

ऊपर लिखित सरलीकृत है। अतिरिक्त विकल्पों के लिए पैकेज ध्वज documentation देखें। अधिक "शक्ति" कुछ परिस्थितियों में द्वारा अधिग्रहीत किया जा सकता है, उदाहरण के लिए, flag.Flagset का उपयोग कर अर्थात एक पैकेज के भीतर झंडा विकल्प के लिए स्थानीय राज्य का उपयोग करके।

हालांकि, मैं व्यक्तिगत रूप से किसी भी तरीके से पैकेज "मुख्य" पैकेज के बाहर पैकेज "ध्वज" का उपयोग नहीं करना चाहता हूं और इसके एपीआई के माध्यम से किसी कॉन्फ़िगर करने योग्य पैकेज व्यवहार को सेट अप करना चाहता हूं। अपवाद मौजूद हैं, हालांकि, उदा। * _test फ़ाइलों या अन्य विशेष मामलों में।

+2

धन्यवाद। मैंने वास्तव में गॉशक को अपनी सेटिंग्स फ़ाइल में गुमनाम रूप से आयात करके परीक्षण और त्रुटि के साथ कोड को ठीक किया, और अब सभी झंडे एक साथ काम करते हैं। अपना जवाब पढ़ने और गॉचेक स्रोत को देखने के बाद मैं समझता हूं कि यह क्यों काम करता है - गोचेक कभी झंडा नहीं कहता है। पर्स(), इसलिए मुझे यह सुनिश्चित करना होगा कि मेरी सेटिंग्स.init() विधि से पहले गोचेक आयात हो जाए और सभी झंडे एक साथ काम करो। अच्छी सलाह हालांकि मुख्य रूप से केवल झंडे को झुकाव के बारे में, मैं इसे भविष्य के लिए ध्यान में रखूंगा। – danny