バージョン番号を自動的に更新する


108

アプリケーションのバージョンプロパティをビルドごとに増やしたいのですが、Visual Studio(2005/2008)でこの機能を有効にする方法がわかりません。AssemblyVersionを1.0。*として指定しようとしましたが、それは私が望むものを正確に取得しません。

私は設定ファイルも使用していますが、以前の試みでは、アセンブリバージョンが変更されたときに、アプリケーションが別のディレクトリで設定ファイルを探したため、設定がデフォルトにリセットされました。

バージョン番号を1.1.38の形式で表示できるようにしたいので、ユーザーが問題を見つけたときに、使用しているバージョンをログに記録したり、古いリリースがある場合はアップグレードするように指示したりできます。

バージョン管理がどのように機能するかについての簡単な説明もいただければ幸いです。ビルド番号とリビジョン番号はいつ増加しますか?


次の質問は、ビルドイベントでソースファイルを生成してアプリケーションにビルド番号を挿入する方法に関する簡単で便利な解決策です。stackoverflow.com/questions/4450231/...
アシュリー・デイヴィス

回答:


96

「組み込み」のものではできません。1.0。*または1.0.0。*を使用すると、リビジョン番号とビルド番号がコード化された日付/タイムスタンプに置き換えられます。これも通常は良い方法です。

詳細については、/ vタグのアセンブリリンカーのドキュメントを参照してください。

自動的に増分する数値については、AssemblyInfoタスクを使用します。

AssemblyInfoタスク

これは、ビルド番号を自動的に増分するように構成できます。

2つの問題があります。

  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#では、ビルドは実際には3番目の数値であり、一部の人々(たとえば、Major.Minor.Release.Buildに慣れているDelphi開発者)が期待する4番目の数値ではありません。

.netでは、Major.Minor.Build.Revisionです。


3
:私はちょうどこのVisual Studioのアドインそれが何か似ていたautobuildversion.codeplex.com
jrsconfitto

6
それは、2179年6月4日にマイクロソフトのデフォルトのバージョン番号が壊れることを意味しますか?(2000年から65536日目)
ロイドパウエル

1
@Jugglingnutcase-現在のバージョンのビジュアルスタジオで機能した場合、そのリンクはほぼ完璧になります
Kraang Prime

2
@SanuelJacksonははは!そうだね。残念ですが、2010年のコメントについていけません。ごめんなさい!:P時間とバージョンの行進は私たち全員を悲しませます。
jrsconfitto 2015年

@Michael Stum:回答のAssemblyInfoタスクのリンクを更新していただけませんか?私にとっては、正しく読み込まれていません。
Matt

22

VS.NETは、アセンブリバージョンを1.0。*にデフォルト設定し、自動インクリメント時に次のロジックを使用します。ビルドパーツを2000年1月1日からの日数に設定し、リビジョンパーツを真夜中からの秒数に設定します。 2で割った現地時間。この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.HHMMではなくyyyy.MM.dd.HHmm。
JHubbard80

1
これは、アセンブリファイルの変更に何らかのバージョン番号を添付する最も簡単なソリューションです。
Alexei

6

どのソース管理システムを使用していますか?

それらのほとんどすべてに、ファイルがチェックインされると展開される何らかの形式の$ Id $タグがあります。

私は通常、ハッカーを使ってこれをバージョン番号として表示します。

もう1つの方法は、ビルド番号として日付を使用することです:080803-1448


「ほとんどすべてに、ファイルがチェックインされたときに展開される何らかの形式の$ Id $タグがあります」で展開できますか?具体的には、破壊について知っていますか?
グレッグB

3

[Visual Studio 2017、.csprojプロパティ]

PackageVersion / Version / AssemblyVersionプロパティ(またはその他のプロパティ)を自動的に更新するには、まず、Microsoft.Build.Utilities.Task現在のビルド番号を取得して更新された番号を返す新しいクラスを作成します(そのクラス専用の別のプロジェクトを作成することをお勧めします)。

私は手動で自動的にビルド番号(1.1を更新するためのMSBuildをメジャー。マイナー番号を更新しますが、してみましょう。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プロセスでTaskを呼び出し、.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

少し前に、バージョン番号をassemblyinfo。{cs / vb}で更新する迅速でダーティなexeを作成しました-rxfind.exe(シンプルで強力な正規表現ベースの検索置換ツール)を使用してビルドプロセスの一部としてコマンドラインから更新します。その他の役立つヒント:

  1. assemblyinfoを製品パーツ(会社名、バージョンなど)とアセンブリ固有のパーツ(アセンブリ名など)に分離します。こちらをご覧ください
  2. また、私はsubversionを使用しているので、ビルド番号をsubversionリビジョン番号に設定すると、アセンブリを生成したコードベースにいつでも簡単に戻ることができます(例: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.