2009-01-13 11 views
10

का उपयोग कर असेंबली वर्जनिंग मैंने अपनी परियोजनाओं के समूह के लिए क्रूज़ कंट्रोल.net स्थापित किया है जो संबंधित हैं। परिणामस्वरूप क्रूज़ कंट्रोल में एक एकल प्रोजेक्ट टैग में कई एसवीएन चेकआउट हैं और फिर एमएसबिल्ड कार्यों का एक गुच्छा सभी व्यक्तिगत एसएलएन फाइलों को संकलित करता है।CruiseControl.net

इस बिल्ड को पूरा होने पर मुझे सभी समाधानों के असेंबली संस्करण को अपडेट करने की आवश्यकता है। हालांकि, चूंकि मैं नैन का उपयोग नहीं कर रहा हूं और MSBuild proj फ़ाइलों का उपयोग नहीं कर रहा हूं, इसलिए मुझे यह सुनिश्चित नहीं है कि इसे कैसे प्राप्त किया जाए।

मुझे आश्चर्य है कि मुझे कुछ स्पष्ट याद आ रही है। मुझे बस एक समाधान की आवश्यकता है जिसे ccnet.config फ़ाइल में उचित परिवर्तन करके लागू किया जा सकता है, मुझे csproj फ़ाइलों में परिवर्तन करने की आवश्यकता के बिना।

धन्यवाद, Anj

+1

मैं उलझन में हूं। जब आप कहते हैं "MSBuild proj फ़ाइलों का उपयोग नहीं करते" तो आपका क्या मतलब है? आपके * एसएसएल फाइलों द्वारा संदर्भित क्या है? (आईडीई द्वारा बनाई गई परियोजना फाइलें, जैसे * .csproj फाइलें, नियमित एमएसबिल्ड प्रोजेक्ट फाइलें हैं, जिन्हें आप कस्टम बिल्ड कार्यों और लक्ष्यों के साथ खोल सकते हैं और बढ़ा सकते हैं।) –

उत्तर

3

मैं इसके लिए powershell का उपयोग करें। lpath स्रोत कोड का मार्ग है, और buildnum मेरा buildnumber मैं संलग्न है। मैं वास्तव में इसके साथ ऐसा करता हूं। हालांकि, यह आपको उपलब्ध किसी भी या सभी अन्य क्षेत्रों को बदलने या सेट करने के लिए पर्याप्त देना चाहिए। मैं lpath में पास करता हूं और मुझे CC.NET में उपलब्ध पर्यावरण चर से buildnumber मिलता है और मैं इस स्क्रिप्ट का बार-बार उपयोग कर सकता हूं, बस कॉन्फ़िगरेशन फ़ाइल में कमांड लाइन पर जो भी पास करता हूं उसे बदलता हूं। मेरे पास एक ऐसा भी है जो सी ++ कोड के लिए संसाधन फ़ाइलों को संशोधित करता है यदि वास्तव में आपको संशोधित करने की आवश्यकता है।

$files = Get-ChildItem $lpath -recurse -filter *AssemblyInfo.cs -name 

Foreach ($file in $files) 
{ 
    $file = $lpath + "\" + $file 

    $fileObject=get-item $file 

    $fileObject.Set_IsReadOnly($False) 

    $sr = new-object System.IO.StreamReader($file, [System.Text.Encoding]::GetEncoding("utf-8")) 
    $content = $sr.ReadToEnd() 
    $sr.Close() 

    $content = [Regex]::Replace($content, '(?<=\[assembly: AssemblyVersion\("[0-9].[0-9].[0-9].)[0-9]?[0-9]?[0-9]', $buildnum); 
    $content = [Regex]::Replace($content, '(?<=\[assembly: AssemblyFileVersion\("[0-9].[0-9].[0-9].)[0-9]?[0-9]?[0-9]', $buildnum); 

    $sw = new-object System.IO.StreamWriter($file, $false, [System.Text.Encoding]::GetEncoding("utf-8")) 
    $sw.Write($content) 
    $sw.Close() 

    $fileObject.Set_IsReadOnly($True) 
} 
+0

मुझे यह रेगेक्स बेहतर काम करता है (कई अंकों के साथ काम करता है) '$ सामग्री = [Regex] :: बदलें ($ सामग्री, '(असेंबली: असेंबली वर्जन \ (\" \ d + \। \ d + \। \ d +) \। \ d +', '$ 1।' + $ buildnum); ' – Myster

11

अपनी परियोजनाओं में साझा असेंबलीइन्फो का उपयोग करने के बारे में क्या?

इसी को हम अपने उत्पादों के लिए करना है:

  • प्रत्येक परियोजना यह खुद AssemblyInfo.cs है है - इस AssemblyTitle, AssemblyDescription, Guid, और अन्य विशेषताओं है कि विधानसभा के लिए अद्वितीय हैं शामिल हैं।

  • प्रत्येक प्रोजेक्ट में दो अन्य असेंबली जानकारी फ़ाइलें भी हैं, ध्यान दें कि इन्हें सीधे फ़ाइल (वीएस -> जोड़ें -> मौजूदा फ़ाइल -> लिंक के रूप में जोड़ें (जोड़ने के बगल में थोड़ा नीचे तीर) के बजाय एक लिंक के रूप में जोड़ा गया है।)

दो लिंक फ़ाइलें:

  1. CompanyAssemblyInfo.cs - AssemblyCompany, AssemblyCopyright, AssemblyConfiguration, CLSCompliant, SecurityPermission, आदि मूल रूप से सब कुछ हम अपने सभी विधानसभाओं पर मानक चाहते हैं।

  2. ProductAssemblyInfo.cs - असेंबली उत्पाद, असेंबली वर्जन, असेंबलीफाइलवर्सन। यह हमें एक ही संस्करण को एक फ़ाइल से सभी असेंबली में धक्का देने की अनुमति देता है।

हमारे सीआई और रिहाई प्रक्रिया अधिक जटिल है, लेकिन वह यह के दिल में है - एक बिंदु (फाइल) जो उत्पाद संस्करण (विधानसभाओं, संस्थापक, सब कुछ!)

6

एक कार्य नहीं है को नियंत्रित करता है ऐसा करने के लिए जो आप पूछ रहे हैं।

आपको MSBuildCommunity कार्यों को स्थापित करने की आवश्यकता होगी, here मिला।

उसके बाद, आप कुछ इस तरह बना सकते हैं:

<PropertyGroup> 
<MyAssemblyVersion>$(CCNetLabel)</MyAssemblyVersion> 
</PropertyGroup> 

<Target Name="GenAssemblyInfo"> 
    <AssemblyInfo 
     ContinueOnError="false" 
     CodeLanguage="CS" 
     OutputFile="$(MSBuildProjectDirectory)\YourAssembly\AssemblyInfo.cs" 
     AssemblyTitle="blah" 
     AssemblyDescription="blah blah" 
     AssemblyCompany="Anj Software, Inc." 
     AssemblyProduct="Anj's Awesome App" 
     AssemblyCopyright="blah blah" 
     CLSCompliant="false" 
     AssemblyVersion="$(MyAssemblyVersion)" 
     AssemblyFileVersion="$(MyAssemblyVersion)" 
    /> 
</Target> 

नोट है कि आप अपने ccnet.config फ़ाइल में एक बिल्ड नंबर उपसर्ग सेट कर सकते हैं ताकि आपके विधानसभाओं 2.1.0.x गिने किया जाएगा जहां एक्स है निर्माण संख्या इस तरह हम अपना वर्जन नंबरिंग करते हैं जहां मैं काम करता हूं।

आपको अभी भी एक डिफ़ॉल्ट AssemblyInfo.cs फ़ाइल रखने की आवश्यकता होगी जो आपके समाधान को बनाने वाली प्रत्येक परियोजना के हिस्से के रूप में है।

+0

प्रश्न से, ऐसा लगता है कि वह इस के लिए msbuild पर भरोसा नहीं करना चाहता था। –

+1

हाँ, मैं उस दृष्टिकोण से असहमत हूं - आप वास्तव में अपनी सीसीनेट कॉन्फ़िगरेशन फ़ाइल को जितना संभव हो उतना करने के लिए चाहते हैं, और इसके गले लगाएंगे एमएसबिल्ड फ़ाइल में निर्माण प्रक्रिया। एमएसबिल्ड के पास असेंबली संस्करणों जैसी चीजों के लिए और अधिक कार्यक्षमता है। यही कारण है कि सीसीनेट ने एमएसबिल्ड पर $ (CCNetLabel) मान को स्पष्ट रूप से पास किया है। –

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