Tự động cập nhật số phiên bản


108

Tôi muốn thuộc tính phiên bản của ứng dụng của mình được tăng lên cho mỗi bản dựng nhưng tôi không chắc về cách bật chức năng này trong Visual Studio (2005/2008). Tôi đã cố gắng chỉ định AssemblyVersion là 1.0. * Nhưng nó không mang lại cho tôi chính xác những gì tôi muốn.

Tôi cũng đang sử dụng tệp cài đặt và trong những lần thử trước đó khi phiên bản lắp ráp thay đổi, cài đặt của tôi đã được đặt lại về mặc định vì ứng dụng tìm kiếm tệp cài đặt trong thư mục khác.

Tôi muốn có thể hiển thị số phiên bản ở dạng 1.1.38 để khi người dùng tìm thấy sự cố, tôi có thể ghi lại phiên bản họ đang sử dụng cũng như yêu cầu họ nâng cấp nếu họ có bản phát hành cũ.

Giải thích ngắn gọn về cách hoạt động của phiên bản cũng sẽ được đánh giá cao. Khi nào thì số bản dựng và bản sửa đổi được tăng lên?


Câu hỏi sau có một giải pháp thuận tiện đơn giản về cách đưa số bản dựng vào ứng dụng của bạn bằng cách tạo tệp nguồn trong sự kiện bản dựng. stackoverflow.com/questions/4450231/…
Ashley Davis

Câu trả lời:


96

Với nội dung "Tích hợp sẵn", bạn không thể, vì sử dụng 1.0. * Hoặc 1.0.0. * Sẽ thay thế các số hiệu chỉnh và xây dựng bằng một ngày / dấu thời gian được mã hóa, đây cũng là một cách hay.

Để biết thêm thông tin, hãy xem Tài liệu về trình liên kết lắp ráp trong thẻ / v.

Đối với số tự động tăng dần, hãy sử dụng Tác vụ AssemblyInfo:

Nhiệm vụ AssemblyInfo

Điều này có thể được cấu hình để tự động tăng số bản dựng.

Có 2 Gotchas:

  1. Mỗi số trong 4 số trong chuỗi Phiên bản được giới hạn ở 65535. Đây là Giới hạn của Windows và không có khả năng được sửa.
  2. Sử dụng với Subversion yêu cầu một thay đổi nhỏ:

Việc lấy số Phiên bản sau đó khá dễ dàng:

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

Và, để làm rõ: Trong .net hoặc ít nhất là trong C #, bản dựng thực sự là số THỨ BA, không phải là số thứ tư như một số người (ví dụ như Nhà phát triển Delphi đã quen với Major.Minor.Release.Build) có thể mong đợi.

Trong .net, đó là Major.Minor.Build.Revision.


3
tôi vừa tìm thấy tiện ích bổ trợ studio trực quan này hoạt động tương tự: autobuildversion.codeplex.com
jrsconfitto

6
Điều đó có nghĩa là vào ngày 4 tháng 6 năm 2179, số phiên bản mặc định của Microsoft sẽ bị phá vỡ? (ngày thứ 65536 sau năm 2000)
Lloyd Powell

1
@Jugglingnutcase - liên kết đó sẽ gần như hoàn hảo, nếu nó hoạt động cho các phiên bản hiện tại của studio trực quan
Kraang Prime

2
@SanuelJackson haha! vâng nó sẽ. quá tệ, tôi không theo kịp các ý kiến ​​của tôi từ năm 2010, xin lỗi! : P Cuộc hành trình của thời gian và những phiên bản làm buồn tất cả chúng ta.
jrsconfitto

@Michael Stum: Bạn có thể cập nhật liên kết cho Nhiệm vụ AssemblyInfo trong câu trả lời của mình không? Đối với tôi, nó không tải chính xác.
Matt

22

VS.NET mặc định phiên bản Assembly là 1.0. * Và sử dụng logic sau khi tự động tăng: nó đặt phần xây dựng thành số ngày kể từ ngày 1 tháng 1 năm 2000 và đặt phần sửa đổi thành số giây kể từ nửa đêm, giờ địa phương, chia cho hai. Xem bài viết MSDN này .

Phiên bản lắp ráp nằm trong tệp assemblyinfo.vb hoặc assemblyinfo.cs. Từ tệp:

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

Cảm ơn vì đã bao gồm ngày đầu tiên:January 1st, 2000
kiewic

11

Tôi nhận thấy rằng nó hoạt động tốt khi chỉ cần hiển thị ngày của bản dựng cuối cùng bằng cách sử dụng thông tin sau ở bất cứ nơi nào cần phiên bản sản phẩm:

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

Thay vì cố gắng lấy phiên bản từ những thứ như sau:

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
Tôi nghĩ ý bạn là: yyyy.MM.dd.Hmm không phải yyyy.MM.dd.HHMM.
JHubbard80

1
Đây là giải pháp đơn giản nhất để có một số loại số phiên bản được đính kèm để thay đổi tệp lắp ráp.
Alexei

6

Bạn đang sử dụng hệ thống điều khiển nguồn nào?

Hầu như tất cả chúng đều có một số dạng thẻ $ Id $ được mở rộng khi tệp được đăng ký.

Tôi thường sử dụng một số hình thức hackery để hiển thị đây là số phiên bản.

Giải pháp thay thế khác được sử dụng để sử dụng ngày làm số bản dựng: 080803-1448


Bạn có thể mở rộng thêm về "Hầu như tất cả chúng đều có một số dạng thẻ $ Id $ được mở rộng khi tệp được đăng ký". Cụ thể, bạn có biết cho cuộc lật đổ?
Greg B

3

[Visual Studio 2017, thuộc tính .csproj ]

Để tự động cập nhật thuộc tính PackageVersion / Version / AssemblyVersion của bạn (hoặc bất kỳ thuộc tính nào khác), trước tiên, hãy tạo một Microsoft.Build.Utilities.Tasklớp mới sẽ lấy số bản dựng hiện tại của bạn và gửi lại số đã cập nhật (tôi khuyên bạn nên tạo một dự án riêng chỉ cho lớp đó).

Tôi cập nhật thủ công các số major.minor, nhưng hãy để MSBuild tự động cập nhật số bản dựng (1.1. 1 , 1.1. 2 , 1.1. 3 , v.v. :)

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

}

Sau đó, gọi quy trình Tác vụ trên MSBuild được tạo gần đây của bạn, thêm mã tiếp theo vào tệp .csproj của bạn:

<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>
 ..

Khi chọn tùy chọn dự án Visual Studio Pack (chỉ cần thay đổi để BeforeTargets="Build"thực thi tác vụ trước khi Xây dựng), mã RefreshVersion sẽ được kích hoạt để tính toán số phiên bản mới và XmlPoketác vụ sẽ cập nhật thuộc tính .csproj của bạn cho phù hợp (có, nó sẽ sửa đổi tệp).

Khi làm việc với các thư viện NuGet, tôi cũng gửi gói đến kho lưu trữ NuGet bằng cách thêm tác vụ xây dựng tiếp theo vào ví dụ trước.

<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\nugetlà nơi tôi có ứng dụng NuGet (hãy nhớ lưu khóa NuGet API của bạn bằng cách gọi nuget SetApiKey <my-api-key>hoặc đưa khóa vào lệnh gọi đẩy NuGet).

Chỉ trong trường hợp nó giúp ai đó ^ _ ^.


1

Cách đây một thời gian, tôi đã viết một exe nhanh chóng và bẩn thỉu sẽ cập nhật phiên bản # trong một assemblyinfo. {Cs / vb} - Tôi cũng đã sử dụng rxfind.exe (một công cụ thay thế tìm kiếm dựa trên regex đơn giản và mạnh mẽ) để thực hiện cập nhật từ một dòng lệnh như một phần của quá trình xây dựng. Một vài gợi ý về quy tắc trợ giúp khác:

  1. tách lắp ráp thành các bộ phận sản phẩm (tên công ty, phiên bản, v.v.) và lắp ráp các bộ phận cụ thể (tên lắp ráp, v.v.). Xem tại đây
  2. Ngoài ra - tôi sử dụng subversion, vì vậy tôi thấy rất hữu ích khi đặt số bản dựng thành số bản sửa đổi subversion, do đó giúp bạn luôn dễ dàng quay lại cơ sở mã đã tạo ra bản lắp ráp (ví dụ: 1.4.100.1502 được tạo từ bản sửa đổi 1502).

Nếu là tệp mã ( .cs / .vb), bạn nên sử dụng mẫu T4 để thay thế.
BrainSlugs83

0

Nếu bạn muốn một số tự động tăng dần cập nhật mỗi khi hoàn tất quá trình biên dịch, bạn có thể sử dụng VersionUpdater từ một sự kiện tạo trước. Sự kiện trước khi xây dựng của bạn có thể kiểm tra cấu hình bản dựng nếu bạn muốn để số phiên bản sẽ chỉ tăng lên đối với bản dựng Bản phát hành (ví dụ:).


Hấp dẫn. Tôi đã có của riêng tôi trong nhiều năm qua có cùng tên và không biết rằng một trong những tồn tại (mặc dù tôi chỉ cần đặt nó trực tuyến gần đây): github.com/rjamesnw/VersionUpdater
James Wilkins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.