স্বয়ংক্রিয়ভাবে সংস্করণ নম্বর আপডেট করুন


108

আমি প্রতিটি বিল্ডের জন্য আমার অ্যাপ্লিকেশনটির সংস্করণ সম্পত্তি বৃদ্ধি করতে চাই তবে ভিজ্যুয়াল স্টুডিওতে এই কার্যকারিতাটি কীভাবে সক্ষম করতে হবে সে সম্পর্কে আমি নিশ্চিত নই (2005/2008)। আমি অ্যাসেম্বলি ভার্সনটি 1.0 হিসাবে নির্দিষ্ট করার চেষ্টা করেছি * * তবে আমি যা চাই তা ঠিক তা পায় না।

আমি একটি সেটিংস ফাইলও ব্যবহার করছি এবং পূর্ববর্তী প্রচেষ্টাগুলিতে যখন এসেম্বলি সংস্করণটি পরিবর্তন করে আমার সেটিংস ডিফল্টে পুনরায় সেট হয়ে যায় যেহেতু অ্যাপ্লিকেশনটি অন্য ডিরেক্টরিতে সেটিংস ফাইলটির সন্ধান করে।

আমি ১.১.৩৮ আকারে একটি সংস্করণ নম্বর প্রদর্শন করতে সক্ষম হতে চাই যাতে কোনও ব্যবহারকারী যখন কোন সমস্যা পান তবে আমি তাদের যে সংস্করণটি ব্যবহার করছি তা লগইন করতে পারি এবং তাদের যদি কোনও পুরানো প্রকাশ থাকে তবে আপগ্রেড করতে বলি।

সংস্করণ কীভাবে কাজ করে তার একটি সংক্ষিপ্ত ব্যাখ্যাও প্রশংসা হবে। বিল্ড এবং রিভিশন নম্বরটি কখন বাড়ানো হয়?


কোনও বিল্ড ইভেন্টে উত্স ফাইল উত্পন্ন করে আপনার অ্যাপ্লিকেশনটিতে বিল্ড নম্বর কীভাবে ইনজেক্ট করা যায় সে সম্পর্কে নীচের প্রশ্নের একটি সহজ সুবিধাজনক সমাধান রয়েছে। stackoverflow.com/questions/4450231/…
অ্যাশলে ডেভিস

উত্তর:


96

"বিল্ট ইন" স্টাফের সাহায্যে আপনি 1.0 ব্যবহার করতে পারবেন না। * বা 1.0.0। * সংশোধনটি প্রতিস্থাপন করবে এবং কোডেড তারিখ / টাইমস্ট্যাম্পের সাহায্যে সংখ্যা তৈরি করবে যা সাধারণত ভাল উপায়।

আরও তথ্যের জন্য, / ভি ট্যাগে অ্যাসেম্বলি লিঙ্কার ডকুমেন্টেশন দেখুন।

স্বয়ংক্রিয়ভাবে সংখ্যা বাড়ানোর ক্ষেত্রে, এসেম্বলিআইফো কার্যটি ব্যবহার করুন:

এসেম্বলইনফো টাস্ক

বিল্ড নম্বরটি স্বয়ংক্রিয়ভাবে বাড়ানোর জন্য এটি কনফিগার করা যেতে পারে।

এখানে 2 টি গটচা রয়েছে:

  1. সংস্করণ স্ট্রিংয়ের 4 টি সংখ্যার প্রত্যেকটিই 65535 এর মধ্যে সীমাবদ্ধ This এটি একটি উইন্ডোজ সীমাবদ্ধতা এবং ঠিক হওয়ার সম্ভাবনা নেই।
  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);

এবং, স্পষ্ট করে বলার জন্য: নেট বা কমপক্ষে সি # তে, বিল্ডটি আসলে তৃতীয় নম্বর, কিছু লোকের মতো চতুর্থ নয় (উদাহরণস্বরূপ ডেলফি ডেভেলপার যারা মেজর.মিনোর.রিলিজ.বিল্ড ব্যবহার করেন) তারা আশা করতে পারে।

নেট ইন, এটি মেজর.মিনার.বিল্ড। রিভিশন।


3
আমি সবেমাত্র এই ভিজ্যুয়াল স্টুডিওটিকে অ্যাড-ইন পেয়েছি যা একই রকম কিছু করে: অটোবিল্ডভার্সন কোডপ্লেক্স.কম
জার্সকনফিট

6
এর অর্থ কি 4 জুন 2179 এ মাইক্রোসফ্টের ডিফল্ট সংস্করণ নম্বরগুলি ভেঙে যাবে? (2000 সালের পরে 65536 তম দিন)
লয়েড পাওয়েল

1
@ জাগলিংনাটকেস - সেই লিঙ্কটি নিখুঁত হবে, যদি এটি ভিজ্যুয়াল স্টুডিওর বর্তমান সংস্করণগুলির জন্য কাজ করে
ক্রাং প্রাইম

2
@ সানুয়েল জ্যাকসন হা হা! হ্যাঁ এটা হবে। খুব খারাপ আমি ২০১০ সাল থেকে আমার মন্তব্যগুলি রাখি না, দুঃখিত! : পি সময় এবং সংস্করণগুলির মার্চ আমাদের সকলকে দুঃখিত করে।
jrsconfitto

@ মিশেল স্টুম: আপনি কি উত্তর দিয়ে এসেম্বলি ইনফো টাস্কের লিঙ্কটি আপডেট করতে পারবেন ? আমার জন্য, এটি সঠিকভাবে লোড হচ্ছে না।
ম্যাট

22

ভিএস.এনইটি অ্যাসেম্বলি সংস্করণটিকে ১.০ এ ডিফল্ট করে * স্থানীয় সময়, দুটি দ্বারা বিভক্ত। এই এমএসডিএন নিবন্ধটি দেখুন

অ্যাসেম্বলি সংস্করণটি অ্যাসেম্বলিনফো.ভিবি বা এসেম্বলিনফো.সি ফাইলগুলিতে অবস্থিত। ফাইল থেকে:

' 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
কেউইক

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.HHmm নয় yyyy.MM.dd.HHmm।
JHubbard80

1
একসাথে ভার্সন নম্বর পরিবর্তনের সাথে সংযুক্ত সংখ্যার ভার্সন নম্বর রাখার এটি সহজ সমাধান।
আলেক্সি

6

আপনি কোন সোর্স কন্ট্রোল সিস্টেমটি ব্যবহার করছেন?

তাদের প্রায় সকলেরই some আইডি $ ট্যাগের কিছু ফর্ম রয়েছে যা ফাইলটি চেক ইন করা অবস্থায় প্রসারিত হয়।

আমি সাধারণত সংস্করণ নম্বর হিসাবে এটি প্রদর্শন করতে হ্যাকারি কিছু ফর্ম ব্যবহার।

অন্যান্য বিকল্পটি তারিখটি বিল্ড নম্বর হিসাবে ব্যবহার করতে হয়: 080803-1448


আপনি কি "প্রসারিত করতে পারেন তাদের প্রায় সকলেরই gets আইডি $ ট্যাগের কিছু ফর্ম রয়েছে যা ফাইলটি চেক ইন করা অবস্থায় প্রসারিত হয়"। বিশেষত, আপনি কি subversiion জন্য জানেন?
গ্রেগ বি

3

[ভিজ্যুয়াল স্টুডিও 2017, .csproj বৈশিষ্ট্য]

আপনার প্যাকেজ ভার্শন / সংস্করণ / সংসদীয় সংস্করণ (বা অন্য কোনও সম্পত্তি) স্বয়ংক্রিয়ভাবে আপডেট করার জন্য, প্রথমে একটি নতুন Microsoft.Build.Utilities.Taskশ্রেণি তৈরি করুন যা আপনার বর্তমান বিল্ড নম্বরটি পেতে এবং আপডেট নম্বরটি প্রেরণ করবে (আমি কেবল class শ্রেণীর জন্য একটি পৃথক প্রকল্প তৈরি করার পরামর্শ দিই)।

আমি নিজেই মেজর.মিনার নম্বরগুলি আপডেট করি তবে এমএসবিল্ডকে বিল্ড নম্বরটি স্বয়ংক্রিয়ভাবে আপডেট করতে দিন (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;
    }

}

তারপরে আপনার .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"বিল্ড করার আগে টাস্কটি কার্যকর করার জন্য কেবল পরিবর্তন করুন ) নতুন সংস্করণ নম্বর গণনা করার জন্য রিফ্রেশভিশন কোডটি ট্রিগার করা XmlPokeহবে , এবং টাস্কটি আপনার .csproj সম্পত্তি অনুসারে আপডেট করবে (হ্যাঁ, এটি ফাইলটি পরিবর্তন করবে)।

নুগেট লাইব্রেরিগুলির সাথে কাজ করার সময়, আমি পূর্বের উদাহরণটিতে কেবল পরবর্তী বিল্ড টাস্ক যুক্ত করে প্যাকেজটি নুগেট সংগ্রহস্থলে প্রেরণ করি।

<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 SetApiKey <my-api-key>বা নিউগেট পুশ কলটিতে কীটি অন্তর্ভুক্ত করার জন্য মনে রাখবেন )।

কেবল যদি এটি কাউকে helps _ ^ সহায়তা করে ^


1

কিছু সময় আগে আমি একটি দ্রুত এবং নোংরা উদাহরণটি লিখেছি যা # এসেম্বলিনফোতে সংস্করণটির আপডেট করবে {সিএস / ভিবি} - আমি rxfind.exe (একটি সাধারণ এবং শক্তিশালী রেজেক্স-ভিত্তিক অনুসন্ধান প্রতিস্থাপন সরঞ্জাম) ব্যবহার করার জন্যও ব্যবহার করেছি বিল্ড প্রক্রিয়া অংশ হিসাবে একটি কমান্ড লাইন থেকে আপডেট। অন্যান্য হেল্পফুলের কয়েকটি ইঙ্গিত:

  1. অ্যাসেমব্লিনফোকে পণ্যের অংশ (সংস্থার নাম, সংস্করণ ইত্যাদি) এবং সমাবেশের নির্দিষ্ট অংশগুলিতে (সমাবেশের নাম ইত্যাদি) আলাদা করুন। এখানে দেখুন
  2. এছাড়াও - আমি সাবভারশন ব্যবহার করি, সুতরাং বিল্ড নম্বরটি সাবস্ট্রেশন রিভিশন নম্বরে সেট করা আমার পক্ষে সহায়ক মনে হয়েছিল যার ফলে সমাবেশটি উত্পন্ন কোডবেজে ফিরে যাওয়া সহজভাবে তৈরি হয়েছিল (উদাহরণস্বরূপ, 1.4.100.1502 সংশোধন 1502 থেকে নির্মিত হয়েছিল)।

যদি এটি কোনও কোড ফাইলের জন্য ( .cs / .vb) হয় তবে তার পরিবর্তে আপনার একটি টি 4 টেম্পলেট ব্যবহার করা উচিত।
BrainSlugs83

0

আপনি যদি কোনও স্বয়ংক্রিয় বর্ধনকারী নম্বর চান যা প্রতিবার সংকলন সম্পন্ন হওয়ার পরে আপডেট হয় তবে আপনি প্রাক-বিল্ড ইভেন্ট থেকে ভার্সনআপডেটার ব্যবহার করতে পারেন । আপনার প্রাক-বিল্ড ইভেন্টটি বিল্ড কনফিগারেশনটি পরীক্ষা করতে পারে যদি আপনি পছন্দ করেন তবে সংস্করণ নম্বরটি কেবলমাত্র একটি রিলিজ বিল্ডের জন্য বৃদ্ধি করবে (উদাহরণস্বরূপ)।


মজাদার. একই নামটি নিয়ে আমি বছরের পর বছর ধরে আমার নিজের ছিলাম এবং জানতাম না যে একটিটির
জেমস উইলকিনস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.