c# - 設定 - アセンブリ情報 とは




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

自分のアプリケーションのversionプロパティをビルドごとに増やすようにしたいのですが、Visual Studio(2005/2008)でこの機能を有効にする方法がわかりません。 私はAssemblyVersionを1.0と指定しようとしました。

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

私は1.1.38の形式でバージョン番号を表示できるようにしたいので、ユーザーが問題を見つけたとき、私は彼らが使用しているバージョンをログに記録することができます。

バージョニングがどのように機能するかについての簡単な説明もまた感謝されるでしょう。 ビルド番号とリビジョン番号はいつ増分されますか?


"Built in"のものでは、1.0。*や1.0.0。*のようにリビジョン番号とビルド番号をコード化された日付/タイムスタンプに置き換えることはできません。これも通常は良い方法です。

詳細については、/ vタグ内の Assembly Linkerの ドキュメントを参照してください。

自動的に増加する数値に関しては、AssemblyInfoタスクを使用してください。

AssemblyInfoタスク

これは自動的にビルド番号を増やすように設定できます。

2つのGotchaがあります:

  1. Version文字列内の4つの数字のそれぞれは65535に制限されています。これはWindowsの制限事項であり、修正されることはほとんどありません。
  2. Subversionでwithを使用するには、少し変更が必要です。

バージョン番号を取得するのはとても簡単です。

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番目の番号であり、メジャー。マイナー。リリース。ビルドに慣れているDelphi開発者など、4番目の番号ではありません。

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


VS.NETは、アセンブリバージョンをデフォルトで1.0。*に設定し、自動インクリメント時に次のロジックを使用します。ビルドパーツを2000年1月1日以降の日数に設定し、改訂部分を深夜0時からの秒数に設定します。現地時間、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")> 

コンパイルが行われるたびに更新される自動増分番号が必要な場合は、ビルド前のイベントから VersionUpdater を使用できます。 バージョン番号がReleaseビルドに対してのみ増加するように、ビルド前のイベントでビルド構成を確認できます。


少し前に、assemblyinfoでバージョン番号を更新するための、すばやく汚いexeを書きました。{cs / vb} - rxfind.exe(単純で強力な正規表現ベースの検索置換ツール)も使っています。ビルドプロセスの一部としてコマンドラインから更新します。 他にいくつかのhelpfuleヒントがあります。

  1. assemblyinfoを製品部品(会社名、バージョンなど)とアセンブリ固有の部品(アセンブリ名など)に分けます。 こちらをご覧 here
  2. また、私はsubversionを使っているので、ビルド番号をsubversionのリビジョン番号に設定すると、アセンブリを生成したコードベースにいつでも戻れるようになるので便利です(例:1.4.100.1502はリビジョン1502からビルドされました)。

[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" 前にタスクを実行するために 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 APIキーを保存するか、NuGetプッシュ呼び出しにキーを含めることを忘れないでください)。

万が一のためにそれは誰かを助けます^ _ ^。








versioning