क्या मैं Visual Studio का उपयोग करते समय फ़ाइल बिल्ड संस्करण को स्वचालित रूप से बढ़ा सकता हूं?


358

मैं बस सोच रहा था कि मैं विज़ुअल स्टूडियो (2005) का उपयोग करके अपनी फ़ाइलों के निर्माण (और संस्करण?) को स्वचालित रूप से कैसे बढ़ा सकता हूं ।

यदि मैं कहने के गुणों को देखता हूं C:\Windows\notepad.exe, तो संस्करण टैब "फ़ाइल संस्करण: 5.1.2600.2180" देता है। मैं अपने dll के संस्करण में भी इन कूल नंबरों को प्राप्त करना चाहूंगा, न कि संस्करण 1.0.0.0, जो यह सामना करने देता है कि यह थोड़ा सुस्त है।

मैंने कुछ चीजों की कोशिश की, लेकिन यह आउट-ऑफ-बॉक्स कार्यक्षमता नहीं लगती है, या शायद मैं सिर्फ गलत जगह (हमेशा की तरह) देख रहा हूं।

मैं मुख्य रूप से वेब प्रोजेक्ट्स के साथ काम करता हूं ...।

मैंने दोनों को देखा:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

और मैं विश्वास नहीं कर सकता था कि कुछ करने का इतना प्रयास मानक अभ्यास है।

संपादित करें: यह VS2005 में काम नहीं करता है जहाँ तक मैं बता सकता हूँ ( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx )


1
वाइल्ड कार्ड केवल AssemblyVersion के लिए काम करने के लिए लग रहे हैं लेकिन वी.एस. 2005 में AssemblyFileVersion के लिए नहीं
dotnetcoder

क्या इसका कोई समाधान है जो VS2005 में C ++ प्रोजेक्ट्स के लिए काम करता है? सभी जवाब .Net को पुन: व्यवस्थित करने लगते हैं। संबंधित प्रश्न । धन्यवाद
Deanna

.Net कोर प्रोजेक्ट असेंबली में ऑटो-इंक्रीमेंट डिफ़ॉल्ट रूप से काम नहीं करता है। आपको csproj में <निर्धारक> गलत </ निर्धारक> जोड़ने की आवश्यकता है। दृश्य स्टूडियो 2017 (.NET कोर) में ऑटो संस्करण
माइकल फ्रीजिम

जवाबों:


434

दृश्य स्टूडियो 2008 में, निम्नलिखित कार्य करता है।

असेंबलीइन्फो खोजें। फाइल और इन 2 लाइनों को खोजें:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

आप इसे बदलने की कोशिश कर सकते हैं:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

लेकिन यह आपको वांछित परिणाम नहीं देगा, आप 1.0 के उत्पाद संस्करण के साथ समाप्त हो जाएंगे । * और 1.0.0.0 का एक फ़ाइल संस्करण । आप जो चाहते हैं वो नहीं!

हालाँकि, यदि आप इन लाइनों में से दूसरा हटा देते हैं और बस:

[assembly: AssemblyVersion("1.0.*")]

फिर कंपाइलर फ़ाइल संस्करण को उत्पाद संस्करण के बराबर सेट करेगा और आपको स्वचालित रूप से वेतन वृद्धि उत्पाद और फ़ाइल संस्करण के वांछित परिणाम प्राप्त होंगे जो सिंक में हैं। उदा। 1.0.3266.92689


2
यह किसी और चीज के रूप में अच्छा काम करता है, और वीएस 200 में काम करता है। मैं 1.0.1.56 जैसे कुछ तर्कसंगत संख्या के लिए उम्मीद की गई थी में बदले मैं 1.0.3266.30135 मिलता है लेकिन कम से कम यह (हालांकि कुछ यादृच्छिक संख्या से: डी) बढ़ जाती है
बावजूद

14
ओह मैं सिर्फ इसे पढ़ने: यह स्वचालित रूप से की तारीख के साथ पिछले दो संख्या में भरना होगा (कुछ बिंदु से दिनों में) और समय (आधी रात से आधे सेकंड)
बावजूद

20
असेंबली को हटाने के लिए आवश्यकता पर अच्छा कॉलफ्रेम इस काम को करने के लिए विशेषता को हटा देता है!
डेविड फेइवरे

76
मुझे लगता है कि यह एक पुराना प्रश्न है, लेकिन इस टिप्पणी को दूसरों के लिए जोड़ना चाहते हैं जो इस उत्तर के लिए अपना रास्ता ढूंढते हैं। यदि आप असेंबली वर्जन बढ़ाते हैं, तो आपके डीएल का उपयोग करने वाली किसी भी परियोजना को फिर से संकलित करने की आवश्यकता होगी। हालाँकि, यदि आप असेंबली को एक समान रखते हैं और असेंबली फ़ाइलवेरेशन को अपने आप बढ़ाते हैं, तो आप जो भी उपयोग कर रहे हैं उसे दोबारा संकलित किए बिना नए dll को स्वैप कर सकते हैं। तो अपने आप से यह पूछें, क्या यह सिर्फ एक नया निर्माण है, या क्या मैं एक नया संस्करण जारी कर रहा हूं?
वनफुटस्विल

27
@ DD59 'बिल्ड' जनवरी 1 2000 से दिनों की संख्या है; 'संशोधन' आधी रात से 2 सेकंड (आधे-सेकंड में नहीं, बल्कि दो-सेकंड के अंतराल) से विभाजित है। यहां देखें: stackoverflow.com/a/3387167/11545
क्रिस्टियन डायकोन्सक्यू

154

असेंबलीInfo.cs फ़ाइल खोलें और बदलें

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

सेवा

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

आप IDE में प्रोजेक्ट -> प्रॉपर्टीज़ -> असेंबली जानकारी पर जाकर कर सकते हैं

हालांकि यह आपको केवल असेंबली संस्करण को बढ़ाने के लिए अनुमति देगा और आपको देगा

असेंबली फ़ाइल संस्करण: इस क्षेत्र में एक वाइल्डकार्ड ("*") की अनुमति नहीं है

संदेश बॉक्स यदि आप फ़ाइल संस्करण क्षेत्र में एक जगह रखने की कोशिश करते हैं।

तो बस असेंबली को खोलें। मैन्युअल रूप से करें।


हाँ मैं बस का सामना करना पड़ा "" विधानसभा फ़ाइल संस्करण: किसी वाइल्डकार्ड ( "*") इस क्षेत्र में अनुमति नहीं है "है कि क्या अपने विधि जीता हरी टिक: डी
बावजूद

3
इस काम करता है: [विधानसभा: AssemblyVersion ( "1.0 *।")] // [विधानसभा: AssemblyFileVersion ( "1.0.0.0")]
बावजूद

4
एक रिलीज चक्र के दौरान असेंबली वर्जन संख्या को बदलना वांछनीय नहीं है। इसके बजाय, असेंबलीफाइल वर्जन को बदला जाना चाहिए। इस विषय पर मेरी ब्लॉग पोस्ट देखें: philippetruche.wordpress.com/2008/08/12/… नंबरों को बदलने के लिए Suzanne Cook की उत्कृष्ट पोस्ट भी देखें: blogs.msdn.com/b/suzcook/archive/2007/05/ 29 / 57148.aspx
फिलिप

46
मैं * 4 जून 2179 को काम करना बंद कर दूंगा, जब दिन 65536 हो जाएगा
लॉयड पावेल

3
@Shimmy: जोड़ें <नियतात्मक> झूठी </ नियतात्मक> को .csproj ऑटो संशोधन विजुअल स्टूडियो 2017 (.NET कोर) में
माइकल Freidgeim

53

प्रत्येक बिल्ड में संस्करण संख्याओं को बदलने का एक अन्य विकल्प MSBuild.Community.Tasks के संस्करण कार्य का उपयोग करना है । बस उनका इंस्टॉलर डाउनलोड करें, इसे इंस्टॉल करें, फिर निम्न कोड को अनुकूलित करें और अपनी फ़ाइल में पेस्ट करें :<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />.csproj

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

नोट: अपने लोकेल में StartDate प्रॉपर्टी को एडॉप्ट करें। यह वर्तमान में अपरिवर्तनीय संस्कृति का उपयोग नहीं करता है।

14 जनवरी, 2010 को तीसरी बिल्ड के लिए, यह VersionInfo.csइस सामग्री के साथ बनाता है:

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]

इस फ़ाइल को तब प्रोजेक्ट में जोड़ा जाना चाहिए ( मौजूदा आइटम जोड़ें ), AssemblyVersionऔर AssemblyFileVersionलाइनों को हटा दिया जाना चाहिए AssemblyInfo.cs

संस्करण घटकों को बदलने के लिए अलग-अलग एल्गोरिदम में वर्णित हैं $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chmऔर संस्करण गुण


2
यह सबसे अच्छा तरीका है कि मैंने अभी तक भयानक तथ्य के आसपास देखा है कि FileVersion संरचनाएं 16 बिट पूर्णांक का उपयोग करती हैं।
माइक पोस्ट

1
मेरे पास पैकेज कंसोल का उपयोग करके वीएस २०२ में स्थापित करने के मुद्दे थे, इसलिए डाउनलोड किए गए रात के एमएसआई इंस्टॉलर को github.com/loresoft/msbuildtasks/downloads पर उपयोग करने की सलाह दें । ऊपर से कॉपी / पेस्ट का काम करता है। धन्यवाद!
डेवियो

इसके बाद इसे अस्वीकार कर दिया गया और इस पोस्ट पर संपादित किया गया: "आप इस loresoft.com/projects/msbuildtasks/ पर भी जांच कर सकते हैं। यह पहले बताई गई बुनियादी कार्यक्षमता में सुधार कर सकता है।"
राडू florescu

1
यह टीएफएस के साथ निर्माण करने वालों के लिए एक व्यवहार्य समाधान नहीं है। अंतिम रूप से, यह संस्करणइन्फो .cs और version.txt फ़ाइलों के लिए एक लंबित संपादन जोड़ देगा। मेरे लिए, प्रत्येक बिल्ड के लिए एक लंबित संपादन होना वांछनीय नहीं है।
जद्दन

@JDennis टीएफएस वर्जनिंग टिप्स के लिए यहां देखें ...
क्रिश्चियन

25

मैं ईसाइयों के समान एक समाधान के साथ आया था, लेकिन सामुदायिक MSBuild कार्यों के आधार पर, यह मेरे लिए कोई विकल्प नहीं है क्योंकि मैं अपने सभी डेवलपर्स के लिए इन कार्यों को स्थापित नहीं करना चाहता।

मैं कोड तैयार कर रहा हूं और एक असेंबली का संकलन कर रहा हूं और ऑटो-इंक्रीमेंट वर्जन नंबर चाहता हूं। हालाँकि, मैं वी.एस. 6.0 का उपयोग नहीं कर सकता। * असेंबली वर्जन ट्रिक क्योंकि यह ऑटो-इन्क्रीमेंट प्रत्येक दिन संख्याओं का निर्माण करता है और असेंबली के साथ संगतता को तोड़ता है जो पुराने बिल्ड नंबर का उपयोग करते हैं। इसके बजाय, मैं एक हार्ड-कोडेड असेंबली विमोचन करना चाहता हूं, लेकिन एक आटो-इन्क्रिमेंटिंग असेंबली फ़िलेवर्सन। मैंने असेंबली में इनवर्जन को निर्दिष्ट करके पूरा किया है। Info.cs और MSBuou जैसे में एक VersionInfo.cs जेनरेट कर रहा है,

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

यह एक असेंबली विशेषता के साथ एक असेंबली विशेषता के साथ VersionInfo.cs फ़ाइल उत्पन्न करेगा जहाँ संस्करण बिल्ड दिनांक के साथ YY.MM.DD.TTTT के स्कीमा का अनुसरण करता है। आपको इस फ़ाइल को अपनी परियोजना में शामिल करना होगा और इसके साथ निर्माण करना होगा।


MSBuild चर का समर्थन करता है? [System.DateTime]::Nowएक में डालना बेहतर होगा , अन्यथा, एक दौड़ की स्थिति है जो एक पुरानी बिल्ड संख्या का उपयोग कर सकती है यदि आधी रात के पास निर्माण किया जाए।
एडवर्ड ब्रे

क्या आपने इन चार गुणों DateTime.ToStringको प्रदर्शनकारी उद्देश्यों के लिए एकल में संयोजित करने के बजाय परिभाषित किया है, या कोई विशेष कारण है?
मफू

यदि आपका FirstBuild इवेंट VS2017 में आग नहीं लगाता है तो stackoverflow.com/questions/43921992/…
Rhys जोन्स की

यह समाधान यहां सभी उत्तरों में से सबसे उपयुक्त है। हालाँकि, समस्या यह है, टाइमस्टैम्प (या versioninfo.cs फ़ाइल की सामग्री) अद्यतन नहीं करता है यदि आप दूसरी बार प्रोजेक्ट बनाते हैं जो एक अलग मिनट का उत्पादन करना चाहिए। यदि मैं प्रोजेक्ट को बंद और पुनः लोड करता हूं, तो टाइमस्टैम्प अपडेट हो जाता है। क्या यह MSBuild से बग है? @ बोग
Cary

16

बिल्ड संस्करण वृद्धि ऐड-इन स्थापित करें । यह आपको * विकल्प की तुलना में अधिक नियंत्रण प्रदान करता है।


केवल VS2005 / 2008 के लिए, VS2010 के लिए एक बीटा के साथ
स्टीवेंस

autobuildversion.codeplex.com/discussions/393154 r3mote203 से थ्रेड के अंत के पास ड्रॉपबॉक्स लिंक, 2010 के लिए है और 2012 (और शायद 2013) में काम करता है।
18

2
मैं VS2012 के लिए स्वचालित संस्करण का उपयोग कर रहा हूं , और यह बहुत अच्छा काम कर रहा है।
Redcurry

12

संस्करण संख्या प्राप्त करने के लिए प्रयास करें

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = assembly.GetName();
 Version version = assemblyName.Version;

संस्करण संख्या सेट करने के लिए, असेंबलीInfo.cs बनाएं / संपादित करें

 [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyFileVersion("1.0.*")]

साइड नोट के रूप में भी, तीसरी संख्या 2/1/2000 से दिनों की संख्या है और चौथी संख्या दिन में कुल सेकंड की मात्रा का आधा है। इसलिए यदि आप आधी रात को संकलन करते हैं तो यह शून्य होना चाहिए।


12

एक दृश्य स्टूडियो एक्सटेंशन स्वचालित संस्करण है जो विज़ुअल स्टूडियो (2012, 2013, 2015) 2017 और 2019 का समर्थन करता है।

स्क्रीन शॉट्स यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


इसलिए मैंने इसे अनइंस्टॉल कर दिया है और मैं और भी कह सकता हूं ... यह मूल csproj फाइल को संशोधित करता है। मुझे लगता है कि यह बहुत समस्याग्रस्त विस्तार है।
मैक्सिम

2
@ मैक्सीम नवीनतम संस्करण का प्रयास करें, इसे वीएस 2017 पर काम करना चाहिए
रेडी

बहुत बढ़िया उपयोग। Vs2017 में मेरे लिए ठीक है। डॉक्स थोड़ा स्पष्ट हो सकता है, लेकिन इसे (साइट के माध्यम से) स्थापित करें और फिर Nuget के माध्यम से MSBuild स्थापित करें, एक छोटे प्रोजेक्ट पर लागू करें और खेल और निर्माण करें। अच्छा लगा। @ बोग का जवाब मेरे लिए कारगर नहीं रहा, हालांकि उन्होंने कहा कि मैं क्या हासिल करने की कोशिश कर रहा था।
गलती से

8

असेंबलीइन्फो में संस्करण संख्या में या प्रोजेक्ट गुण के तहत एक * सेट करना जैसा कि अन्य पदों में वर्णित है, विज़ुअल स्टूडियो / .NET के सभी संस्करणों के साथ काम नहीं करता है।

अफाक ने वीएस 2005 (लेकिन वीएस 2003 और वीएस 2008 में) में काम नहीं किया। वीएस 2005 के लिए आप निम्नलिखित का उपयोग कर सकते हैं: ऑटो इंक्रीमेंट विज़ुअल स्टूडियो 2005 संस्करण का निर्माण और संकलन समय पर संशोधन संख्या

लेकिन ध्यान रखें कि मजबूत नाम वाली असेंबली के लिए संस्करण संख्या को स्वचालित रूप से बदलने की अनुशंसा नहीं की जाती है। कारण यह है कि इस तरह के एक विधानसभा के सभी संदर्भों को हर बार अद्यतन किया जाना चाहिए क्योंकि संदर्भित विधानसभा को इस तथ्य के कारण फिर से बनाया गया है कि मजबूत नाम वाले विधानसभा संदर्भ हमेशा एक विशिष्ट विधानसभा संस्करण का संदर्भ होते हैं। Microsoft स्वयं .NET फ्रेमवर्क असेंबली के संस्करण संख्या को केवल तभी बदलता है जब इंटरफेस में परिवर्तन होते हैं। (NB: मैं अभी भी MSDN में लिंक खोज रहा हूँ जहाँ मैंने पढ़ा है।)


मुझे लगता है कि वीएस के किसी भी संस्करण के लिए आप केवल बिल्ड या रिवीजन बॉक्स में * डाल सकते हैं। मैंने अभी वीएस 2005 का उपयोग करके इसे आज़माया है, और यह ठीक काम करता है। मुझे यकीन नहीं है कि उस कोड प्रोजेक्ट लेख के लेखक किस बारे में बात कर रहे हैं।
मुशीगेंसिस

हो सकता है कि यह एक सर्विस पैक के साथ वापस आया हो, लेकिन मुझे याद है कि जब मैंने वीएस 2005 का उपयोग किया था, तो यह काम करने के लिए उपयोग नहीं किया था।
डिर्क वोल्मार

यह 2005 के साथ काम नहीं करता है, मैं एक सर्विस पैक की तलाश करूंगा और वापस रिपोर्ट करूंगा।
बावजूद

शायद MusiGenesis में एक ऐड-ऑन स्थापित है जो स्वचालित संस्करण को सक्षम कर रहा है।
डिर्क वोल्मार

@ डिवो: नहीं, मैं ऐड-ऑन-फ़ोबिक हूं। मेरे पास सिर्फ Visual Studio 2005 Professional SP1 है। मैंने * के साथ कभी कोई समस्या नहीं देखी है, लेकिन मैं आमतौर पर मैन्युअल रूप से वेतन वृद्धि करता हूं। एक अजीब बग की तरह लगता है।
मुशीगेंसिस

6

असेंबलिंग (DateTime) जानकारी को असेंबली फ़ाइलेवेशन प्रॉपर्टी में प्राप्त करने के लिए जिसमें किसी भी निर्भरता को नहीं तोड़ने का लाभ है।


बूग के समाधान पर निर्माण (मेरे लिए काम नहीं किया, शायद VS2008 के कारण?), आप एक फ़ाइल बनाने के लिए एक पूर्व-निर्माण घटना के संयोजन का उपयोग कर सकते हैं, उस फ़ाइल को जोड़ सकते हैं (इसके संस्करण गुण सहित) और फिर बाहर पढ़ने के लिए एक तरीके का उपयोग करना। उन मूल्यों को फिर से। अर्थात्..

पूर्व बिल्ड-घटना:

echo [assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

अपनी परियोजना में परिणामी VersionInfo.cs फ़ाइल (गुण सबफ़ोल्डर) शामिल करें

दिनांक वापस पाने के लिए कोड (सेकंड से नीचे वर्ष):

var version = assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

बहुत सहज नहीं है .. भी, मुझे नहीं पता कि क्या यह बहुत अधिक बल-पुनर्निर्माण करता है (चूंकि एक फ़ाइल हमेशा बदलती है)।

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


यह पूरी तरह से काम करता है। हालाँकि, यह नियमित अभिव्यक्ति% दिनांक: ~ -4,4%।% दिनांक: ~ -7,2 %% दिनांक: ~ -10,2%।% समय: ~ 0,2%% समय: ~ 3,2% ।% समय: ~ -5,2% "बस बहुत जटिल है।
कैरी

5

संस्करण संख्या को "1.0। *" पर सेट करें और यह स्वचालित रूप से अंतिम दो संख्या को तारीख (कुछ बिंदु से दिनों में) और समय (आधी रात से आधे सेकंड) के साथ भर देगा।


अरे, अगर मैंने शुरुआत में इसे ठीक से पढ़ा होता तो मैं खुद को बहुत बचा लेता। THX
बावजूद


4

केक असेम्बलीइन्फो फाइल्स पैचिंग को सपोर्ट करता है। हाथों में केक के साथ आपके पास स्वचालित संस्करण वृद्धि को लागू करने के अनंत तरीके हैं।

C # संकलक की तरह वर्जन बढ़ाने का सरल उदाहरण है:

Setup(() =>
{
    // Executed BEFORE the first task.
    var datetimeNow = DateTime.Now;
    var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
    var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
    var assemblyInfo = new AssemblyInfoSettings
    {
        Version = "3.0.0.0",
        FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
    };
    CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

यहाँ:

  • संस्करण - विधानसभा संस्करण है। सबसे अच्छा अभ्यास प्रमुख संस्करण संख्या लॉक करना और शून्य के साथ शेष रहना (जैसे "1.0.0.0") है।
  • FileVersion - असेंबली फ़ाइल संस्करण है।

ध्यान दें कि आप न केवल संस्करण बल्कि अन्य सभी आवश्यक जानकारी भी पैच कर सकते हैं


3

प्रोजेक्ट पर जाएं | प्रॉपर्टीज और फिर असेंबली इंफॉर्मेशन और फिर असेंबली वर्जन और लास्ट या सेकंड-टू-लास्ट बॉक्स (आप मेजर या माइनर कंपोनेंट्स को ऑटो-इन्क्रीमेंट नहीं कर सकते हैं) में * डालें।


2

MSBuild सामुदायिक कार्य ( http://msbuildtasks.tigris.org/ ) प्रोजेक्ट से असेंबलीइन्फो कार्य का उपयोग करें , और इसे अपने .csproj / .vbproj फ़ाइल में एकीकृत करें।

इसके पास कई विकल्प हैं, जिनमें एक संस्करण की संख्या को दिन की तारीख और समय से जोड़ना है।

सिफारिश की।


2

मेरे आवेदन के लिए अभी,

string ver = Application.ProductVersion;

रिटर्न ver = 1.0.3251.27860

मूल्य 1/1/2000 से 3251 दिनों की संख्या है। मैं अपने एप्लिकेशन की स्प्लैश स्क्रीन पर एक संस्करण निर्माण तिथि डालने के लिए इसका उपयोग करता हूं। एक उपयोगकर्ता के साथ काम करते समय, मैं निर्माण की तारीख पूछ सकता हूं जो कुछ लंबी संख्या की तुलना में संवाद करना आसान है।

(मैं एक छोटी कंपनी का समर्थन करने वाला वन-मैन विभाग हूं। यह दृष्टिकोण आपके लिए काम नहीं कर सकता है।)


आपका नंबर तेजी से रन आउट होने वाला है। मैं वर्ष की शुरुआत से 2 अंकों का वर्ष और 3 अंकों का दिन का उपयोग करूंगा जो कि अधिकतम 365 है। कम से कम आपका कार्यक्रम वर्ष 2065 तक संकलित होगा। तब आप सेवानिवृत्त हो जाएंगे और किसी और को यह बताएंगे कि वे इसे कैसे संभालना चाहते हैं। आपका कार्यक्रम उस तारीख में आयोग में है!
आआ

2

VS2012 में असेंबलीइंफो को बदलना काम करता है। यह अजीब लगता है कि विज़ुअल स्टूडियो में इसके लिए अधिक समर्थन नहीं है, आपको लगता है कि यह बिल्ड / रिलीज़ प्रक्रिया का एक मूल हिस्सा था।


2

संस्करण कैसे प्राप्त करें {major}.{year}.1{date}.1{time}

यह एक तरह का प्रायोगिक है, लेकिन मुझे यह पसंद है। जेफ एटवुड @ CodingHorror ( लिंक ) से प्रेरित है ।

परिणामी संस्करण संख्या बन जाती है 1.2016.10709.11641(अर्थ 2016-07-09 16:41), जो अनुमति देता है

  • गरीब आदमी शून्य गद्दी (बेवकूफ अग्रणी के साथ) 1 एस के साथ)
  • लगभग-मानव पठनीय स्थानीय डेटाइम संस्करण संख्या में एम्बेडेड है
  • मेजर वर्जन को वास्तव में बड़े बदलावों के लिए अकेला छोड़ देना।

अपनी परियोजना के लिए एक नया आइटम जोड़ें, चयन जनरल -> पाठ टेम्पलेट है, यह जैसा कोई नाम CustomVersionNumberबाहर और (जहां लागू हो) टिप्पणी AssemblyVersionऔर AssemblyFileVersionमेंProperties/AssemblyInfo.cs

फिर, जब इस फ़ाइल को सहेजते हैं, या प्रोजेक्ट का निर्माण करते हैं, तो यह .csबनाई गई .ttफ़ाइल के तहत एक उप-आइटम के रूप में स्थित फ़ाइल को पुन: उत्पन्न करेगा ।

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]

आप हर मिनट अपने कार्यक्रम को संकलित नहीं कर रहे हैं या दिन में एक से अधिक बार तैनात कर रहे हैं, इसलिए तकनीकी रूप से समय भाग अनावश्यक रूप से मूल्यवान जानकारी पर कब्जा कर रहा है, मैं 1 और 2 का उपयोग प्रमुख नाबालिग के लिए और सिर्फ 3 नंबर का उपयोग करेगा तारीख के लिए yyddd (दो अंक) + उसी वर्ष की शुरुआत से दिन) और वृद्धिशील बिल्ड संख्या के लिए 4 छोड़ दें।
आआ

2

मैंने स्वचालित रूप से फ़ाइल संस्करण को बढ़ाने के लिए एक एप्लिकेशन बनाया है।

  1. डाउनलोड आवेदन
  2. इवेंट लाइन को प्री-बिल्ड बनाने के लिए निम्न पंक्ति जोड़ें

    C: \ temp \ IncrementFileVersion.exe $ (SolutionDir) \ Properties \ AssemblyInfo.cs

  3. प्रोजेक्ट बनाएं

इसे सरल रखने के लिए ऐप केवल संदेश फेंकता है यदि कोई त्रुटि है, तो यह पुष्टि करने के लिए कि आपने ठीक काम किया है, आपको 'विधानसभा सूचना' में फ़ाइल संस्करण की जांच करनी होगी

नोट: आपको फ़ील्ड को पॉप्युलेट करने के लिए 'असेंबली इंफॉर्मेशन' बटन के लिए विज़ुअल स्टूडियो में समाधान को फिर से लोड करना होगा, हालाँकि आपकी आउटपुट फ़ाइल में अपडेटेड संस्करण होगा।

सुझावों और अनुरोधों के लिए मुझे telson_alva@yahoo.com पर ईमेल करें


2

विजुअल स्टूडियो 2019 में

यह मुझे जोड़ने के लिए पर्याप्त नहीं था

[assembly: AssemblyVersion("1.0.*")]

इसे बनाते समय मुझे यह त्रुटि दिखाई देती है

निर्दिष्ट संस्करण स्ट्रिंग आवश्यक प्रारूप के अनुरूप नहीं है

समाधान

प्रारूप अंत में मैं सेट के बाद स्वीकार कर लिया गया Deterministicकरने Falseमेंproject.csproj

<Deterministic>false</Deterministic>

संपादित करें:

किसी कारण से स्थापित Deterministicकरने के लिएFalse मेरी कॉन्फिग फ़ाइल गड़बड़ इसे लोड करने और विभिन्न स्थानों पर सहेजने के ।

युक्ति:

मैं संशोधन संख्या बढ़ाने के लिए पोस्ट-बिल्ड ईवेंट सेट करता हूं:

घटना के बाद स्क्रिप्ट बनाएँ

यह एक पॉवरशेल स्क्रिप्ट कहलाता है जिसे autoincrement_version.ps1पासिंग ऑफ़ द लॉजिक ऑफ़ पाथ कहा जाता हैAssemblyInfo.cs

if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)

पावशेल लिपि

यह Regex का उपयोग करके संशोधन संख्या को इंगित करता है

param( [string]$file );
  $regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
  $found = (Get-Content $file) | Select-String -Pattern $regex_revision
  $revision = $found.matches[0].value
  $new_revision = [int]$revision + 1
  (Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8

1

हो सकता है, इस कार्य के लिए, आप इस तरह कोड का उपयोग कर सकते हैं:

    private bool IncreaseFileVersionBuild()
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            try
            {
                var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
                var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
                string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
                System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[assembly: AssemblyFileVersion(\"" + ol + "\")]", "[assembly: AssemblyFileVersion(\"" + ne + "\")]"));
                return true;
            }
            catch
            {
                return false;
            }
        }
        return false;
    }

और इसे फॉर्म लोडिंग से बुलाएं।
इस कोड के साथ आप असेंबली जानकारी के किसी भी भाग को InInfo.cs में अपडेट कर सकते हैं (लेकिन आपको "मानक" निर्देशिका संरचना का उपयोग करना होगा)।



1

मैं इस दृष्टिकोण का उपयोग कर रहा हूँ https://stackoverflow.com/a/827209/3975786 एक "समाधान आइटम" में T4 टेम्पलेट रखकर और प्रत्येक प्रोजेक्ट के भीतर "एड के रूप में लिंक के साथ" का उपयोग करके।


1

हो सकता है कि यहां जवाब देने में बहुत देर हो गई हो, लेकिन उम्मीद है कि यह किसी की व्यस्त समस्या को हल कर देगा।

PowerShell स्क्रिप्ट का उपयोग करके अपनी सभी परियोजनाओं के असेंबली संस्करण को बदलने का एक स्वचालित तरीका। यह लेख आपकी कई समस्याओं का समाधान करेगा।


पीएस के साथ एकमात्र समस्या यह प्रतिक्रिया करने के लिए धीमी है और इसे चलाने की अनुमति देने के लिए कॉन्फ़िगरेशन की आवश्यकता होती है। मैं एक छोटे से निष्पादन योग्य, एक tt4 फ़ाइल या यहां तक ​​कि इनलाइन कोड के साथ जाऊंगा जो मुझे लगता है कि कोई भी प्रोग्रामर एक तरह से लिख सकता है।
आआ

0

हर बार जब मैं इसका निर्माण करता हूं तो यह कम से कम महत्वपूर्ण अंकों को बढ़ाता है।

मुझे नहीं पता कि दूसरों को कैसे अपडेट किया जाए, लेकिन आपको कम से कम यह देखना चाहिए कि पहले से ही ...


1
VS अंतिम संख्या को बढ़ाने का प्रभारी है जो आमतौर पर बिल्ड नंबर है। बाकी सब कुछ (यानी इससे पहले की संख्या) आपके ऊपर है क्योंकि वे आपके आवेदन के संस्करण का प्रतिनिधित्व करते हैं।
Огћен Шобаји

1
Ог Оен њобајињ: बिल्कुल सही नहीं है। Microsoft की नंबरिंग योजना प्रमुख है .minor.build.revision, जैसे 1.0.4.7। यदि आप असेंबली संस्करण को "1.0। *" की तरह सेट करते हैं, तो VS आपके लिए बिल्ड और रिवीजन नंबर सेट करेगा। उस मामले में निर्माण दैनिक वृद्धि होगी, और संशोधन आधी रात के बाद से सेकंड की संख्या होगी, 2 से विभाजित।
साइमन टेवेसी

0

कछुआ तोड़फोड़ का उपयोग करने वाले किसी के लिए, आप अपने संस्करण संख्या में से एक को अपने स्रोत कोड की तोड़फोड़ संशोधन संख्या में बाँध सकते हैं। मुझे यह बहुत उपयोगी लगता है (ऑडिटरों को वास्तव में यह भी पसंद है!)। आप अपने प्री-बिल्ड में WCREV उपयोगिता को कॉल करके और टेम्पलेट से अपनी असेंबलीInfo.cs को जेनरेट करके करते हैं।

यदि आपका टेम्प्लेट असेंबलीइन्फो .wcrev कहलाता है और सामान्य असेंबलीइन्फोइं.ऑक्स निर्देशिका में बैठता है, और कछुआ डिफ़ॉल्ट इंस्टॉलेशन डायरेक्टरी में है, तो आपका प्री-बिल्ड कमांड इस तरह दिखता है (NB एक पंक्ति में)

"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.wcrev"  "$(ProjectDir)Properties\AssemblyInfo.cs"

टेम्पलेट फ़ाइल में wcrev टोकन प्रतिस्थापन स्ट्रिंग शामिल होगा: $ WCREV $
उदा

[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

ध्यान दें:
जैसा कि आपके असेंबलीइन्फो.केक्स अब उत्पन्न होता है, आप नहीं चाहते कि यह संस्करण नियंत्रित हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.