संस्करण संख्या को स्वचालित रूप से अपडेट करें


108

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

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

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

कैसे काम करता है की एक छोटी व्याख्या भी सराहना की जाएगी। बिल्ड और रिवीजन नंबर में वृद्धि कब होती है?


निम्न प्रश्न का एक सरल सुविधाजनक समाधान है कि बिल्ड इवेंट में स्रोत फ़ाइल बनाकर अपने एप्लिकेशन में बिल्ड नंबर को कैसे इंजेक्ट किया जाए। stackoverflow.com/questions/4450231/…
एशले डेविस

जवाबों:


96

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

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

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

असेंबलीइन्फो टास्क

यह बिल्ड नंबर को स्वचालित रूप से बढ़ाने के लिए कॉन्फ़िगर किया जा सकता है।

2 गोत्र हैं:

  1. संस्करण स्ट्रिंग में 4 संख्याओं में से प्रत्येक 65535 तक सीमित है। यह एक विंडोज सीमा है और निश्चित होने की संभावना नहीं है।
  2. तोड़फोड़ के साथ प्रयोग करने के लिए एक छोटे से बदलाव की आवश्यकता होती है:

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

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);

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

.Net में, यह प्रमुख है। Minor.Build.Revision।


3
मैं सिर्फ इस दृश्य स्टूडियो ऐड-इन पाया कि कुछ इसी तरह करता है: autobuildversion.codeplex.com
jrsconfitto

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

1
@ जुगिंगनटकेस - वह लिंक एकदम सही होगा, अगर यह दृश्य स्टूडियो के वर्तमान संस्करणों के लिए काम करता है
क्रैंग प्राइम

2
@SanuelJackson हाहा! हाँ, यह होगा। बहुत बुरा मैं 2010 से अपनी टिप्पणी के साथ नहीं रखते, क्षमा करें! : P समय और संस्करणों का मार्च हम सबको दुखी करता है।
jrsconfitto

@ मिचेल स्टम: क्या आप अपने जवाब में असेंबलीइन्फो टास्क के लिए लिंक अपडेट कर सकते हैं ? मेरे लिए, यह सही ढंग से लोड नहीं हो रहा है।
मैट

22

VS.NET असेंबली वर्जन को 1.0 में डिफॉल्ट करता है। * ऑटो-इंक्रीमेंट करने पर निम्न तर्क का उपयोग करता है: यह बिल्ड भाग को 1 जनवरी, 2000 से दिनों की संख्या में सेट करता है, और रिविजन पार्ट को मिडनाइट के बाद से सेकंड की संख्या में सेट करता है, स्थानीय समय, दो से विभाजित। यह MSDN लेख देखें ।

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

' 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")> 

प्रारंभिक तिथि को शामिल करने के लिए धन्यवाद:January 1st, 2000
kiewic

11

मैंने पाया है कि जहां उत्पाद संस्करण की आवश्यकता होती है, वहां निम्नलिखित का उपयोग करके बस अंतिम निर्माण की तारीख को प्रदर्शित करना अच्छी तरह से काम करता है:

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.Hmm नहीं yyyy.MM.dd.HHMM।
JHubbard80

1
असेंबली फ़ाइल परिवर्तन में किसी प्रकार की संस्करण संख्या संलग्न करने के लिए यह सबसे सरल समाधान है।
अलेक्सेई

6

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

लगभग उन सभी के पास $ Id $ टैग का कोई न कोई रूप है जो फ़ाइल में चेक किए जाने पर विस्तारित हो जाता है।

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

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


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

3

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

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

मैं मैन्युअल रूप से प्रमुख.नंबर संख्याओं को अपडेट करता हूं, लेकिन MSBuild को बिल्ड नंबर (1.1 , 1 , 1.1। 2 , 1.1 , 3 , आदि) को स्वचालित रूप से अपडेट करने दें ।

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;
    }

}

फिर अपनी हाल ही में बनाई गई टास्क को 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>
 ..

जब विजुअल स्टूडियो पैक प्रोजेक्ट विकल्प चुनते हैं (सिर्फ BeforeTargets="Build"बिल्ड से पहले कार्य को निष्पादित करने के लिए बदलें ) नए संस्करण संख्या की गणना करने के लिए RefreshVersion कोड चालू हो जाएगा, और 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 पुश कॉल पर कुंजी को शामिल करने के लिए अपनी NuGet API कुंजी को सहेजना याद रखें )।

बस मामले में यह किसी को मदद करता है ^ _ ^।


1

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

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

यदि यह कोड फ़ाइल ( .cs / .vb) के लिए है, तो आपको इसके बजाय T4 टेम्पलेट का उपयोग करना चाहिए।
BrainSlugs83

0

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


दिलचस्प। मैं एक ही नाम के साथ वर्षों से अपना खुद का था और यह नहीं जानता था कि एक अस्तित्व में है (हालांकि मैंने इसे हाल ही में ऑनलाइन डाला है): github.com/rjamesnw/VersionUpdater
James Wilkins
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.