2012-10-18 27 views
10

मैं .csproj फ़ाइलों में कार्यों और शर्तों के लिए बिल्कुल नया हूं इसलिए किसी भी और सभी मदद की सराहना की जाती है।मैं एक .csproj फ़ाइल में MSBuild कंडीशन के साथ कंपाइलर निर्देशों के लिए परीक्षण कैसे करूं?

मैं जो करना चाहता हूं वह वर्तमान कॉन्फ़िगरेशन में एक विशिष्ट कंपाइलर निर्देश की जांच करना है। एक उदाहरण निम्नलिखित जैसा होगा:

<Choose> 
    <When Condition= [current configuration has CONST-1 compiler constant defined] > 
     ... 
    </When> 
    <When Condition= [current configuration has CONST-2 compiler constant defined] > 
     ... 
    </When> 
</Choose> 

मुझे नहीं पता कि यह भी संभव है या नहीं। अगर मैं जो पूछ रहा हूं उसे करने का बेहतर तरीका है तो मुझे यह भी बताएं। किसी भी तरह से, मैं विन्यास के स्वतंत्र की स्थिति के लिए परीक्षण करना चाहता हूं।

संपादित

क्या मैं सच में चाहते हैं एक मूल्य है कि मैं आसानी से संपादित कर सकते हैं, अधिमानतः दृश्य स्टूडियो के भीतर, कि मैं भी configuraiton की regargless की जांच कर सकते है। मैंने कंपाइलर स्थिरांक के बारे में सोचा क्योंकि आप उन्हें वीएस में प्रोजेक्ट प्रॉपर्टीज में आसानी से बदल सकते हैं।

+0

संभावित रूप से 'संपत्ति' तत्व का उपयोग करना अधिक आम होगा। कॉन्फ़िगरेशन के आधार पर आपकी csproj फ़ाइल में सशर्त 'PropertyGroup' तत्व पहले से ही होंगे। उनके अंदर, आप नए कस्टम 'प्रॉपर्टी' तत्व जोड़ सकते हैं, और आप उन्हें 'कंडीशन =' विशेषता में सामान्य तरीके से जांच सकते हैं। क्या यह आपके लिए काम करेगा, या आपको वास्तव में संकलक निर्देशों की आवश्यकता है? वे अधिक जटिल हैं, क्योंकि ऐसे कई तरीके हैं जिनमें उन्हें परिभाषित किया जा सकता है। – hvd

+0

यह हो सकता है। कस्टम प्रॉपर्टी तत्वों को संपादित करने का कोई तरीका है, मैंने उन्हें जोड़ने के बाद, वीएस में आसानी से .csproj फ़ाइल को संपादित किए बिना आसानी से उन्हें बदलना चाहते हैं? –

+0

जो मैं चाहता हूं वह एक मान परिभाषित किया गया है कि मैं बदल सकता हूं और जांच कर सकता हूं कि कॉन्फ़िगरेशन क्या है। –

उत्तर

8

कंपाइलर स्थिरांक एक संपत्ति "DefineConstants" में सेट हैं ताकि आपको उस संपत्ति का मूल्यांकन करने में सक्षम होना चाहिए। आपके Choose कथन को संपत्ति समूह के बाद जाने की आवश्यकता है जो स्थिरांक को परिभाषित करते हैं या लक्ष्य के अंदर होते हैं।

<Choose> 
    <When Condition="$(DefineConstants.Contains(CONST-1))"> 
     ... 
    </When> 
    <When Condition="$(DefineConstants.Contains(CONST-2))"> 
     ... 
    </When> 
</Choose> 
+1

धन्यवाद यह पूरी तरह से काम किया ... हालांकि मुझे CONST-1 के आसपास उद्धरणों को हटाना पड़ा था या जो भी सशर्त परिभाषा है – Randeep

5

यदि आप एमएसबिल्ड 4 या उच्चतर का उपयोग करते हैं, तो मैं स्ट्रिंग.कॉन्टेन() के बजाय नियमित अभिव्यक्ति का उपयोग करने का सुझाव देता हूं। इसका कारण यह है कि स्ट्रिंग। कंटेनर() आमतौर पर अच्छी तरह से काम करता है, कुछ मामलों में आपको समस्याएं हो सकती हैं।

उदाहरण के लिए:

मामले पर विचार करें जब आप अपने कोड में निर्देशों CONST -1 और CONST-12 का उपयोग करें। हालांकि, आप वर्तमान निर्माण के लिए केवल CONST-12 निर्देश को परिभाषित करने का निर्णय लेते हैं।
अब Condition="$(DefineConstants.Contains('CONST-1'))"True का मूल्यांकन करता है भले ही CONST-1 परिभाषित नहीं किया गया हो।

RegularExpressions.RegEx साथ समाधान:

<When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(DefineConstants), '^(.*;)*CONST-1(;.*)*$'))"> 
... 
</When> 

संक्षेप में, आप या तो सुनिश्चित करें कि आप निर्देश है कि किसी अन्य के सबस्ट्रिंग का उपयोग नहीं करते बनाने के लिए सावधान किया जा सकता है या आप रेगुलर एक्सप्रेशन का उपयोग और कम से चिंता नहीं कर सकता सब।

0

यहां पोस्ट किए गए अन्य उत्तरों में जोड़ने के लिए, आप जिस तरीके से संपर्क कर सकते हैं, वह परिभाषित करने के लिए अर्धविरामों के साथ DefineConstants प्रॉपर्टी को लपेटना है, "; CONST-1;" DefineConstants में निहित होगा अगर केवल "कंसस्ट -1" स्थिर परिभाषित किया गया है। अर्धविरामों के बिना, आप एक चर के रूप में CONST-100, या UNCONST-1, लेकिन CONST-1 नहीं हो सकते हैं और यह सत्य का मूल्यांकन करेगा।

<PropertyGroup> 
    <DefineConstants2>;$(DefineConstants);</DefineConstants2> 
    <Foo Condition="'$(DefineConstants2.Contains(`;CONST-1;`))'">It worked</Foo> 
    <Bar>$(Foo)</Bar> <!--It worked--> 
</PropertyGroup>