อัปเดตหมายเลขเวอร์ชันโดยอัตโนมัติ


108

ฉันต้องการให้คุณสมบัติเวอร์ชันของแอปพลิเคชันของฉันเพิ่มขึ้นสำหรับแต่ละรุ่น แต่ฉันไม่แน่ใจเกี่ยวกับวิธีเปิดใช้งานฟังก์ชันนี้ใน Visual Studio (2005/2008) ฉันได้พยายามระบุ AssemblyVersion เป็น 1.0 * แต่มันไม่ได้ตรงตามที่ฉันต้องการ

ฉันยังใช้ไฟล์การตั้งค่าและในความพยายามก่อนหน้านี้เมื่อเวอร์ชันแอสเซมบลีเปลี่ยนการตั้งค่าของฉันได้ถูกรีเซ็ตเป็นค่าเริ่มต้นเนื่องจากแอปพลิเคชันค้นหาไฟล์การตั้งค่าในไดเร็กทอรีอื่น

ฉันต้องการให้แสดงหมายเลขเวอร์ชันในรูปแบบ 1.1.38 ดังนั้นเมื่อผู้ใช้พบปัญหาฉันสามารถบันทึกเวอร์ชันที่ใช้อยู่และแจ้งให้อัปเกรดได้หากมีเวอร์ชันเก่า

คำอธิบายสั้น ๆ เกี่ยวกับวิธีการทำงานของเวอร์ชันจะได้รับการชื่นชม หมายเลขรุ่นและหมายเลขการแก้ไขจะเพิ่มขึ้นเมื่อใด


คำถามต่อไปนี้มีวิธีง่ายๆง่ายๆในการใส่หมายเลขบิลด์ลงในแอปพลิเคชันของคุณโดยการสร้างไฟล์ต้นฉบับในเหตุการณ์บิลด์ stackoverflow.com/questions/4450231/…
Ashley Davis

คำตอบ:


96

ด้วยสิ่งที่ "สร้างขึ้นใน" คุณไม่สามารถทำได้เนื่องจากการใช้ 1.0 * หรือ 1.0.0 * จะแทนที่การแก้ไขและการสร้างตัวเลขด้วยวันที่ / เวลาประทับที่เข้ารหัสซึ่งโดยปกติแล้วก็เป็นวิธีที่ดีเช่นกัน

สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารAssembly Linkerในแท็ก / v

สำหรับการเพิ่มตัวเลขโดยอัตโนมัติให้ใช้งาน AssemblyInfo:

งาน AssemblyInfo

ซึ่งสามารถกำหนดค่าให้เพิ่มหมายเลขบิลด์โดยอัตโนมัติ

มี 2 ​​Gotchas:

  1. ตัวเลข 4 ตัวในสตริงเวอร์ชัน จำกัด ไว้ที่ 65535 ซึ่งเป็นข้อ จำกัด ของ Windows และไม่น่าจะได้รับการแก้ไข
  2. การใช้กับ Subversion ต้องมีการเปลี่ยนแปลงเล็กน้อย:

การดึงหมายเลขเวอร์ชันนั้นค่อนข้างง่าย:

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 หรืออย่างน้อยใน C # บิลด์นั้นเป็นหมายเลข THIRD ไม่ใช่แบบที่สี่เหมือนบางคน (เช่น Delphi Developers ที่คุ้นเคยกับ Major.Minor.Release.Build) อาจคาดหวัง

ใน. net มันคือ Major.Minor.Build.Revision


3
ฉันเพิ่งพบส่วนเสริมสตูดิโอภาพที่ทำสิ่งที่คล้ายกัน: autobuildversion.codeplex.com
jrsconfitto

6
นั่นหมายความว่าในวันที่ 4 มิถุนายน 2179 หมายเลขเวอร์ชันเริ่มต้นของ Microsoft จะหยุดทำงานหรือไม่? (วันที่ 65536 หลังปี 2000)
Lloyd Powell

1
@Jugglingnutcase - ลิงก์นั้นจะใกล้สมบูรณ์แบบถ้ามันใช้งานได้กับ Visual Studio เวอร์ชันปัจจุบัน
Kraang Prime

2
@SanuelJackson ฮะ! ใช่มันจะ แย่มากฉันไม่ได้ติดตามความคิดเห็นของฉันตั้งแต่ปี 2010 ขอโทษด้วย! : P การเดินขบวนของเวลาและเวอร์ชั่นทำให้เราเสียใจ
jrsconfitto

@ Michael Stum: คุณช่วยอัพเดตลิงค์สำหรับAssemblyInfo Taskในคำตอบของคุณได้ไหม? สำหรับฉันมันโหลดไม่ถูกต้อง
Matt

22

VS.NET เริ่มต้นเวอร์ชันแอสเซมบลีเป็น 1.0 * และใช้ตรรกะต่อไปนี้เมื่อทำการเพิ่มอัตโนมัติ: ตั้งค่าส่วนการสร้างเป็นจำนวนวันตั้งแต่วันที่ 1 มกราคม พ.ศ. 2543 และตั้งค่าส่วนการแก้ไขเป็นจำนวนวินาทีนับตั้งแต่เที่ยงคืน เวลาท้องถิ่นหารด้วยสอง ดูนี้บทความ MSDN

เวอร์ชันแอสเซมบลีจะอยู่ในไฟล์ 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")> 

ขอบคุณที่รวมวันที่เริ่มต้น: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 อืมไม่ใช่ yyyy.MM.dd.HHMM
JHubbard80

1
นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุดในการมีหมายเลขเวอร์ชันแนบกับการเปลี่ยนแปลงไฟล์แอสเซมบลี
Alexei

6

คุณใช้ระบบควบคุมแหล่งใด

เกือบทั้งหมดมีแท็ก $ Id $ บางรูปแบบที่ขยายได้เมื่อเช็คอินไฟล์

ฉันมักจะใช้รูปแบบของการแฮ็กเกอร์เพื่อแสดงเป็นหมายเลขเวอร์ชัน

อีกทางเลือกหนึ่งคือใช้วันที่เป็นหมายเลขรุ่น: 080803-1448


คุณช่วยขยายความใน "เกือบทั้งหมดมีแท็ก $ Id $ บางรูปแบบที่ขยายได้เมื่อเช็คอินไฟล์" โดยเฉพาะคุณรู้หรือไม่ว่าการโค่นล้ม?
Greg B

3

[คุณสมบัติ Visual Studio 2017, .csproj ]

หากต้องการอัปเดตคุณสมบัติ PackageVersion / Version / AssemblyVersion ของคุณโดยอัตโนมัติ (หรือคุณสมบัติอื่น ๆ ) ขั้นแรกให้สร้างMicrosoft.Build.Utilities.Taskคลาสใหม่ที่จะรับหมายเลขบิลด์ปัจจุบันของคุณและส่งหมายเลขที่อัปเดตกลับไป (ขอแนะนำให้สร้างโปรเจ็กต์แยกเฉพาะสำหรับคลาสนั้น)

ฉันอัปเดตหมายเลข major.minor ด้วยตนเอง แต่ให้ 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>
 ..

เมื่อเลือกอ็อพชันโปรเจ็กต์ Visual Studio Pack (เพียงแค่เปลี่ยนเป็นการ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 API ของคุณโดยการโทรnuget SetApiKey <my-api-key>หรือรวมคีย์ไว้ในการโทรแบบพุช NuGet)

เผื่อว่าจะช่วยใคร ^ _ ^


1

เมื่อไม่นานมานี้ฉันได้เขียน exe ที่รวดเร็วและสกปรกซึ่งจะอัปเดตเวอร์ชัน # ในแอสเซมบลีข้อมูล {cs / vb} - ฉันยังใช้ rxfind.exe (เครื่องมือแทนที่การค้นหาตาม regex ที่เรียบง่ายและมีประสิทธิภาพ) เพื่อทำ อัปเดตจากบรรทัดคำสั่งซึ่งเป็นส่วนหนึ่งของกระบวนการสร้าง คำแนะนำวิธีใช้อื่น ๆ อีกสองสามข้อ:

  1. แยกข้อมูลการประกอบออกเป็นชิ้นส่วนผลิตภัณฑ์ (ชื่อ บริษัท รุ่น ฯลฯ ) และประกอบชิ้นส่วนเฉพาะ (ชื่อการประกอบเป็นต้น) ดูที่นี่
  2. นอกจากนี้ - ฉันใช้การโค่นล้มดังนั้นฉันจึงพบว่าการตั้งค่าหมายเลขบิลด์เป็นหมายเลขการแก้ไขการโค่นล้มนั้นเป็นประโยชน์ดังนั้นจึงง่ายมากที่จะกลับไปยังโค้ดเบสที่สร้างแอสเซมบลี (เช่น 1.4.100.1502 สร้างจากการแก้ไข 1502)

หากเป็นไฟล์โค้ด ( .cs / .vb) คุณควรใช้เทมเพลต T4 แทน
BrainSlugs83

0

หากคุณต้องการตัวเลขที่เพิ่มขึ้นอัตโนมัติซึ่งจะอัปเดตทุกครั้งที่รวบรวมเสร็จคุณสามารถใช้VersionUpdaterจากเหตุการณ์ก่อนสร้าง เหตุการณ์ก่อนสร้างของคุณสามารถตรวจสอบการกำหนดค่าบิลด์ได้หากคุณต้องการเพื่อให้หมายเลขเวอร์ชันเพิ่มขึ้นสำหรับรุ่นที่วางจำหน่ายเท่านั้น (ตัวอย่าง)


น่าสนใจ. ฉันมีชื่อเดียวกันเป็นของตัวเองมาหลายปีแล้วและไม่รู้ว่ามีตัวตนอยู่จริง (แม้ว่าฉันเพิ่งจะออนไลน์เมื่อไม่นานมานี้): github.com/rjamesnw/VersionUpdater
James Wilkins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.