質問

アプリケーションの version プロパティをビルドごとに増分したいのですが、Visual Studio (2005/2008) でこの機能を有効にする方法がわかりません。AssemblyVersion を 1.0.* として指定しようとしましたが、希望どおりの結果が得られません。

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

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

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

役に立ちましたか?

解決

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

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

自動的に増加する数値については、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 です。

他のヒント

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

製品バージョンが必要な場合は、次のようにして最後のビルドの日付を表示するだけでうまく機能することがわかりました。

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

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

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

私は通常、これをバージョン番号として表示するために何らかの形式のハッキングを使用します。

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

[ビジュアルスタジオ2017、 .csproj プロパティ]

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

私はメジャー番号とマイナー番号を手動で更新しますが、MSBuild にビルド番号 (1.1.1.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 プッシュ呼び出しにキーを含めます)。

誰かの役に立ちますように^_^。

少し前に、Assemblyinfo.{cs/vb} 内のバージョン番号を更新する簡単で汚い exe を作成しました。また、rxfind.exe (シンプルで強力な正規表現ベースの検索置換ツール) を使用して、ビルド プロセスの一部としてコマンド ラインから更新します。他にも役立つヒントがいくつかあります。

  1. Assemblyinfo を製品部分 (会社名、バージョンなど) とアセンブリ固有の部分 (アセンブリ名など) に分離します。見る ここ
  2. また、私は Subversion を使用しているので、ビルド番号を Subversion リビジョン番号に設定すると、アセンブリを生成したコードベースに常に簡単に戻ることができるようになり、便利であることがわかりました。1.4.100.1502 はリビジョン 1502 から構築されました)。

コンパイルが完了するたびに更新される自動増分番号が必要な場合は、次のように使用できます。 バージョンアップデーター ビルド前のイベントから。必要に応じて、ビルド前イベントでビルド構成をチェックして、バージョン番号がリリース ビルドに対してのみ増加するようにすることができます (たとえば)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top