2008-08-03 23 views
95

अपडेट करें मैं अपने निर्माण की संस्करण प्रॉपर्टी प्रत्येक बिल्ड के लिए बढ़ाना चाहूंगा लेकिन मुझे यकीन नहीं है कि विजुअल स्टूडियो (2005/2008) में इस कार्यक्षमता को कैसे सक्षम किया जाए। मैंने असेंबली वर्जन को 1.0 के रूप में निर्दिष्ट करने का प्रयास किया है। * लेकिन यह मुझे बिल्कुल वही नहीं मिला जो मैं चाहता हूं।स्वचालित रूप से संस्करण संख्या

मैं एक सेटिंग फ़ाइल का उपयोग भी कर रहा हूं और पहले के प्रयासों में जब असेंबली संस्करण बदल गया तो मेरी सेटिंग्स डिफ़ॉल्ट पर रीसेट हो गई क्योंकि एप्लिकेशन ने दूसरी निर्देशिका में सेटिंग्स फ़ाइल की तलाश की थी।

मैं 1.1.38 के रूप में एक संस्करण संख्या प्रदर्शित करने में सक्षम होना चाहता हूं, इसलिए जब कोई उपयोगकर्ता कोई समस्या पाता है तो मैं उस संस्करण को लॉग कर सकता हूं जिसका उपयोग वे कर रहे हैं और साथ ही उन्हें पुरानी रिलीज होने पर अपग्रेड करने के लिए कहें ।

वर्जनिंग कार्यों के बारे में एक संक्षिप्त स्पष्टीकरण भी सराहना की जाएगी। निर्माण और संशोधन संख्या कब बढ़ती है?

+0

निम्नलिखित प्रश्न का एक आसान सुविधाजनक समाधान है कि निर्माण कार्यक्रम में स्रोत फ़ाइल उत्पन्न करके अपने एप्लिकेशन में बिल्ड नंबर को इंजेक्ट कैसे करें। http://stackoverflow.com/questions/4450231/can-i-make-a-constant-from-a-compile-time-env-variable-in-csharp –

+0

संभावित डुप्लिकेट [क्या मैं स्वचालित रूप से फ़ाइल निर्माण संस्करण को बढ़ा सकता हूं विजुअल स्टूडियो का उपयोग करते समय?] (https://stackoverflow.com/questions/356543/can-i-automatically-increment-the-file-build-version-when-using-visual-studio) –

उत्तर

84

"निर्मित" सामग्री के साथ, आप 1.0। * या 1.0.0 का उपयोग करने के रूप में नहीं कर सकते हैं। * संशोधन और संख्याओं को कोडित दिनांक/टाइमस्टैम्प के साथ बदल देगा, जो आमतौर पर एक अच्छा तरीका भी है।

अधिक जानकारी के लिए, Assembly Linker/v टैग में दस्तावेज़ीकरण देखें।

स्वचालित रूप से संख्या बढ़ाने के लिए के रूप में, AssemblyInfo टास्क का उपयोग करें:

AssemblyInfo Task

यह स्वचालित रूप से निर्माण की संख्या को बढ़ाना विन्यस्त किया जा सकता।

2 Gotchas हैं:

  1. संस्करण स्ट्रिंग में 4 संख्या के प्रत्येक 65535 तक सीमित यह एक Windows सीमा और निर्धारित करने के लिए की संभावना नहीं है।

प्राप्त कर रहा है संस्करण संख्या तो काफी आसान है::

  • सबवर्सन के साथ साथ का उपयोग करते हुए एक छोटा सा परिवर्तन की आवश्यकता है

    Version v = Assembly.GetExecutingAssembly().GetName().Version; 
    string About = string.Format(CultureInfo.InvariantCulture, @"YourApp Version {0}.{1}.{2} (r{3})", v.Major, v.Minor, v.Build, v.Revision); 
    

    और, स्पष्ट करने के लिए: .NET में या कम से कम सी # में, निर्माण वास्तव में तीसरे नंबर, नहीं जो Major.Minor.Release करने के लिए इस्तेमाल कर रहे हैं कुछ लोगों के रूप में चौथे (उदाहरण डेल्फी डेवलपर्स के लिए है .बिल्ड) उम्मीद कर सकते हैं।

    .NET में, यह Major.Minor.Build.Revision है।

  • +3

    मुझे यह दृश्य स्टूडियो मिला ऐड-इन ऐसा कुछ करता है: http://autobuildversion.codeplex.com/ – jrsconfitto

    +6

    क्या इसका मतलब है कि 4 जून 2179 को माइक्रोसॉफ्ट डिफ़ॉल्ट संस्करण संख्या तोड़ जाएगी? (2000 के बाद 65536 वें दिन) – ThePower

    +1

    @ जुगलिंगनटकेस - यह लिंक दृश्य स्टूडियो –

    6

    आप किस स्रोत नियंत्रण प्रणाली का उपयोग कर रहे हैं?

    उनमें से लगभग सभी $ क्रमांक $ टैग के कुछ फार्म जब फ़ाइल में चेक किया गया है का विस्तार किया जाता है।

    मैं आमतौर पर संस्करण संख्या के रूप में इसे प्रदर्शित करने के hackery के कुछ फार्म का उपयोग करें।

    अन्य वैकल्पिक बिल्ड नंबर के रूप में उपयोग करने के लिए तिथि का उपयोग करें:। 080803-1448

    +0

    क्या आप विस्तार कर सकते हैं "उनमें से लगभग सभी के पास $ आईडी $ टैग का कुछ रूप है जो फ़ाइल में चेक इन होने पर विस्तारित हो जाता है"। विशेष रूप से, क्या आप subversiion के लिए जानते हैं? –

    1

    कुछ समय पहले मैं एक त्वरित और गंदी exe है कि एक assemblyinfo की अपडेट होगा संस्करण # लिखा {सीएस/vb} - मैंने निर्माण प्रक्रिया के हिस्से के रूप में कमांड लाइन से अद्यतन करने के लिए rxfind.exe (एक सरल और शक्तिशाली regex- आधारित खोज प्रतिस्थापन उपकरण) का भी उपयोग किया है। कुछ अन्य हेल्पफूल संकेत:

    1. असेंबलीइन्फो को उत्पाद भागों (कंपनी का नाम, संस्करण इत्यादि) और असेंबली विशिष्ट भागों (असेंबली नाम इत्यादि) में अलग करें। देखें here
    2. इसके अलावा - मैं सबवर्सन का उपयोग करता हूं, इसलिए मुझे बिल्ड संख्या को उपवर्तन संशोधन संख्या में सेट करने में मदद मिली, जिससे असेंबली उत्पन्न करने वाले कोडबेस पर हमेशा वापस जाना आसान हो गया (उदाहरण के लिए 1.4.100.1502 संशोधन से बनाया गया था 1502)।
    19

    वीएसएनईटी असेंबली संस्करण 1.0 को डिफ़ॉल्ट करता है। * और स्वचालित वृद्धि के दौरान निम्न तर्क का उपयोग करता है: यह 1 जनवरी, 2000 से दिनों की संख्या में निर्माण भाग सेट करता है, और संशोधन भाग को संशोधित करता है आधी रात से सेकंड की संख्या, स्थानीय समय, दो से विभाजित। यह MSDN article देखें।

    असेंबली संस्करण एक assemblyinfo.vb या assemblyinfo.cs फ़ाइल में स्थित है। फ़ाइल से:

    ' Version information for an assembly consists of the following four values: 
    ' 
    '  Major Version 
    '  Minor Version 
    '  Build Number 
    '  Revision 
    ' 
    ' 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")> 
    
    +0

    आरंभिक तिथि सहित धन्यवाद: '1 जनवरी, 2000' – kiewic

    0

    आप हर बार एक संकलन किया जाता है अद्यतन करता है कि एक ऑटो incrementing संख्या चाहते हैं, आप VersionUpdater एक पूर्व निर्माण घटना से उपयोग कर सकते हैं। यदि आप प्राथमिकता देते हैं तो आपका प्री-बिल्ड इवेंट बिल्ड कॉन्फ़िगरेशन की जांच कर सकता है ताकि संस्करण संख्या केवल रिलीज़ बिल्ड (उदाहरण के लिए) के लिए बढ़ेगी।

    +0

    दिलचस्प। मेरे पास एक ही नाम के साथ सालों से मेरा खुद का अधिकार है और मुझे नहीं पता था कि एक अस्तित्व में है (हालांकि मैंने इसे हाल ही में ऑनलाइन रखा है): https://github.com/rjamesnw/VersionUpdater –

    8

    मैंने पाया कि यह अच्छी तरह से काम करता है बस निम्नलिखित का उपयोग कर पिछले निर्माण की तारीख प्रदर्शित करने के लिए जहाँ कहीं भी एक उत्पाद संस्करण की जरूरत है है

    System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString("yyyy.MM.dd.HH.mm.ss") 
    

    बल्कि निम्नलिखित की तरह कुछ से संस्करण प्राप्त करने के प्रयास से:

    System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); 
    object[] attributes = assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), false); 
    object attribute = null; 
    
    if (attributes.Length > 0) 
    { 
        attribute = attributes[0] as System.Reflection.AssemblyFileVersionAttribute; 
    } 
    
    +6

    मुझे लगता है कि आपका मतलब यह है: yyyy। MM.dd.HHmm yyyy.MM.dd.HHMM नहीं। – JHubbard80

    2

    [विजुअल स्टूडियो 2017, .csproj गुण]

    अपने पैकेजवर्सन/संस्करण/असेंबली वर्जन प्रॉपर्टी (या किसी अन्य प्रॉपर्टी) को स्वचालित रूप से अपडेट करने के लिए, पहले, एक नया Microsoft.Build.Utilities.Task क्लास बनाएं जो आपके वर्तमान बिल्ड नंबर को प्राप्त करेगा और अपडेटेड नंबर वापस भेज देगा (मैं केवल इसके लिए एक अलग प्रोजेक्ट बनाने की अनुशंसा करता हूं कक्षा)।

    मैं मैन्युअल रूप से स्वचालित रूप से बिल्ड नंबर (1.1। , 1.1। , 1.1। , आदि :)

    using Microsoft.Build.Framework; 
    using System; 
    using System.Collections.Generic; 
    using System.Text; 
    
    public class RefreshVersion : Microsoft.Build.Utilities.Task 
    { 
        [Output] 
        public string NewVersionString { get; set; } 
        public string CurrentVersionString { get; set; } 
    
        public override bool Execute() 
        {  
         Version currentVersion = new Version(CurrentVersionString ?? "1.0.0"); 
    
         DateTime d = DateTime.Now; 
         NewVersionString = new Version(currentVersion.Major, 
          currentVersion.Minor, currentVersion.Build+1).ToString(); 
         return true; 
        } 
    
    } 
    
    अद्यतन करने के लिए MAJOR.MINOR संख्या अद्यतन करते हैं, लेकिन जाने MSBuild

    फिर अपने हाल ही में बनाए गए कार्य को MSBuild प्रक्रिया पर कॉल करें जो आपके अगले कोड को जोड़ रहा है।csproj फ़ाइल:

    <Project Sdk="Microsoft.NET.Sdk">  
    ... 
    <UsingTask TaskName="RefreshVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\<dll path>\BuildTasks.dll" /> 
    <Target Name="RefreshVersionBuildTask" BeforeTargets="Pack" Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> 
        <RefreshVersion CurrentVersionString="$(PackageVersion)"> 
          <Output TaskParameter="NewVersionString" PropertyName="NewVersionString" />    
        </RefreshVersion> 
        <Message Text="Updating package version number to $(NewVersionString)..." Importance="high" /> 
        <XmlPoke XmlInputPath="$(MSBuildProjectDirectory)\mustache.website.sdk.dotNET.csproj" Query="/Project/PropertyGroup/PackageVersion" Value="$(NewVersionString)" /> 
    </Target> 
    ... 
    <PropertyGroup> 
    .. 
    <PackageVersion>1.1.4</PackageVersion> 
    .. 
    

    जब दृश्य स्टूडियो पैक परियोजना विकल्प उठा RefreshVersion कोड नए संस्करण संख्या की गणना करने ट्रिगर किया जाएगा (बस बिल्ड से पहले कार्य को क्रियान्वित करने के लिए BeforeTargets="Build" करने के लिए बदल), और XmlPoke कार्य अपने .csproj अद्यतन करेगा संपत्ति तदनुसार (हाँ, यह फ़ाइल को संशोधित करेगा)।

    NuGet पुस्तकालयों के साथ काम करते समय, मैं पिछले उदाहरण को अगले निर्माण कार्य को जोड़कर पैकेज को NuGet रिपोजिटरी में भी भेजता हूं।

    <Message Text="Uploading package to NuGet..." Importance="high" /> 
    <Exec WorkingDirectory="$(MSBuildProjectDirectory)\bin\release" Command="c:\nuget\nuget push *.nupkg -Source https://www.nuget.org/api/v2/package" IgnoreExitCode="true" /> 
    

    c:\nuget\nuget जहाँ मैं NuGet ग्राहक है (nuget SetApiKey <my-api-key> फोन करके अपने NuGet API कुंजी को बचाने के लिए या NuGet धक्का कॉल पर कुंजी शामिल करना न भूलें) है।

    बस अगर यह किसी की मदद करता है^_ ^।

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