2010-12-15 9 views
14

हम अपनी परियोजनाओं के निर्माण के लिए Hudson का उपयोग करते हैं, और हडसन आसानी से संकलन समय पर "% BUILD_NUMBER%" जैसे पर्यावरण चर को परिभाषित करता है।क्या मैं csharp में संकलन-समय एनवी चर से निरंतर बना सकता हूं?

मैं कोड में उस चर का उपयोग करना चाहता हूं, इसलिए हम लॉग इन की तरह चीजें कर सकते हैं जो इसे चलाने के समय पर बनाते हैं। हालांकि मैं नहीं कर सकता System.Environment.GetEnvironmentVariable कि क्योंकि रन-टाइम वातावरण तक पहुँचने है, क्या मैं चाहता हूँ है कुछ की तरह:

#define BUILD_NUM = %BUILD_NUMBER% 

या

const string BUILD_NUM = %BUILD_NUMBER% 

सिवाय मैं वाक्य रचना पता नहीं है । क्या कोई कृपया मुझे सही दिशा में अंकित कर सकता है? धन्यवाद!

+0

आप नंबर बदलने के लिए प्री-बिल्ड एक्शन/मैक्रो का उपयोग कर सकते हैं, क्या यह एक विकल्प होगा? – Bobby

+0

मैं ऐसी किसी चीज़ की उम्मीद कर रहा था जिसके लिए फ़ाइलों को हर बार संशोधित करने की आवश्यकता नहीं थी, जहां इनपुट स्रोत फ़ाइलें अपरिवर्तित बनी रहती हैं और वर्तमान मान संकलित आउटपुट में डाला जाता है। –

उत्तर

16

ठीक है यहाँ मैं क्या कर रहा हूँ। यह बहुत सुरुचिपूर्ण नहीं है, लेकिन यह काम करता है। मैं एक पूर्व निर्माण कदम है कि इस तरह दिखता है बनाया:

echo namespace Some.Namespace > "$(ProjectDir)\CiInfo.cs" 
echo { >> "$(ProjectDir)\CiInfo.cs" 
echo  ///^<summary^>Info about the continuous integration server build that produced this binary.^</summary^> >> "$(ProjectDir)\CiInfo.cs" 
echo  public static class CiInfo >> "$(ProjectDir)\CiInfo.cs" 
echo  { >> "$(ProjectDir)\CiInfo.cs" 
echo   ///^<summary^>The current build number, such as "153"^</summary^> >> "$(ProjectDir)\CiInfo.cs" 
echo   public const string BuildNumber = ("%BUILD_NUMBER%" == "" ? @"Unknown" : "%BUILD_NUMBER%"); >> "$(ProjectDir)\CiInfo.cs" 
echo   ///^<summary^>String of the build number and build date/time, and other useful info.^</summary^> >> "$(ProjectDir)\CiInfo.cs" 
echo   public const string BuildTag = ("%BUILD_TAG%" == "" ? @"nohudson" : "%BUILD_TAG%") + " built: %DATE%-%TIME%"; >> "$(ProjectDir)\CiInfo.cs" 
echo  } >> "$(ProjectDir)\CiInfo.cs" 
echo } >> "$(ProjectDir)\CiInfo.cs" 

तब मैं परियोजना के लिए "CiInfo.cs" जोड़ा है, लेकिन संस्करण नियंत्रण से नजरअंदाज कर दिया। इस तरह मुझे इसे कभी संपादित करना या प्रतिबद्ध करना नहीं है, और परियोजना हमेशा निरंतर उपलब्ध है जो नवीनतम निर्माण संख्या और समय है।

+1

क्या सुविधाजनक समाधान है! –

+0

धन्यवाद। मैं इसे बैच फ़ाइल बनाउंगा और फिर इसे बैच से कॉल करूँगा और पथ के साथ फ़ाइल नाम में पास करूँगा और रीडायरेक्ट के लिए% 1 का उपयोग कर सकता हूं जो इसे बनाए रखने में आसान हो सकता है अगर इसे अधिकांश बैच में संभाला जा सकता है: '$ (ProjectDir) \ Tools \ BuildCI.bat "$ (ProjectDir) \ CiInfo.cs" ' –

+0

मुझे यह पसंद है। इतना आसान, कोई प्लगइन्स नहीं! धन्यवाद। – arkod

6

ऐसा करने का एक तरीका संकलन से पहले एक बिल्ड-चरण जोड़ना है जो उचित स्रोत फ़ाइल (%) में% BUILD_NUMBER% के लिए प्रतिस्थापित करता है।

+0

+1, हालांकि अतीत में जब मैंने इसे किया है, मैंने बस '.config' फ़ाइल को सेटिंग के रूप में लक्षित किया है और फिर शेष कोड बस इसे वहां से एक्सेस करता है। –

+0

यह वही है जो हम वर्तमान में करते हैं (हालांकि कॉन्फ़िगरेशन फाइलों के खिलाफ, स्रोत फाइल नहीं), मैं उम्मीद कर रहा था कि मैं इसे सीधे कोड में एक्सेस कर सकता हूं क्योंकि यह काफी सरल, कम त्रुटि प्रवण है, और एक परिवर्तन बनाम के रूप में नहीं दिखाया जाएगा एसवीएन भंडार। –

1

परिभाषा आपको सी # सी में + जैसे कॉन्टेंट को परिभाषित करने की अनुमति नहीं देती है।

this page से:

#define निर्देश निरंतर मूल्यों के रूप में आम तौर पर सी और सी में किया जाता है ++ घोषित करने के लिए नहीं किया जा सकता। सी # में स्थिरांक को सर्वोत्तम श्रेणी या संरचना के स्थिर सदस्यों के रूप में परिभाषित किया जाता है। यदि आपके पास ऐसे कई स्थिरांक हैं, तो उन्हें पकड़ने के लिए एक अलग "कॉन्स्टेंट" कक्षा बनाने पर विचार करें।

यदि आप असेंबलीइन्फो क्लास में बिल्ड नंबर को प्रतिबिंबित करना चाहते हैं, तो अधिकांश बिल्ड टूल्स बिल्डिंग समय पर उस वर्ग को उत्पन्न करने का समर्थन करते हैं। इसके लिए MSBuild has a taskAs does NAnt। सुनिश्चित नहीं है कि हडसन यह कैसे करता है।

1

एक संभावना है कि सभी कॉन्स्टेंट तत्काल के साथ अपनी कॉन्फ़िगरेशन क्लास उत्पन्न करने के लिए टी 4 का उपयोग करें। टी 4 एमएसवीएस में अच्छी तरह से एकीकृत है, आपके अपने कस्टम निर्माण चरण की कोई ज़रूरत नहीं है।

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