web-dev-qa-db-ja.com

Visual Studioを使用しているときにファイルビルディングバージョンを自動的にインクリメントできますか?

自動的にVisual Studio(2005)を使用して自分のファイルのビルド(およびバージョン?)をどのように増やすことができるかと思っていました。

Say C:\Windows\notepad.exeのプロパティを調べると、Versionタブに「File version:5.1.2600.2180」と表示されます。私はこれらのクールな数字をバージョン1.0.0.0ではなく私のdllのバージョンでも取得したいと思います。

私はいくつかのことを試みましたが、それはすぐに使える機能ではないようです、あるいは多分私は間違った場所で見ています(いつものように)。

私は主にWebプロジェクトで作業しています....

私は両方を見ました:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

そして、何かをするためのそれほどの努力が標準的なやり方であると私は信じることができませんでした。

編集:それは私が言うことができる限りVS2005では動作しません( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx

340
inspite

Visual Studio 2008では、次のように動作します。

AssemblyInfo.csファイルを見つけて、次の2行を見つけます。

[Assembly: AssemblyVersion("1.0.0.0")]
[Assembly: AssemblyFileVersion("1.0.0.0")]

これを次のように変更してみてください。

[Assembly: AssemblyVersion("1.0.*")]
[Assembly: AssemblyFileVersion("1.0.*")]

しかし、これでは望みどおりの結果が得られません。製品バージョン1.0。*およびファイルバージョン1.0.0.になります。あなたが望むものではありません!

ただし、これらの行の2行目を削除して、次のようにしたとします。

[Assembly: AssemblyVersion("1.0.*")]

その後、コンパイラはファイルバージョンを製品バージョンと同じになるように設定します。同期している製品とファイルバージョンが自動的にインクリメントされるという結果が得られます。例えば。 1.0.3266.92689

414
Sam Meldrum

assemblyInfo.csファイルを開き、変更します。

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

[Assembly: AssemblyVersion("1.0.*")]
//[Assembly: AssemblyFileVersion("1.0.0.0")]

これをIDEで行うには、プロジェクト - >プロパティ - >アセンブリ情報を選択します。

ただし、これはアセンブリバージョンを自動インクリメントすることだけを許可し、

アセンブリファイルのバージョン:このフィールドではワイルドカード( "*")は使用できません

ファイルバージョンフィールドに*を入力しようとすると、メッセージボックスが表示されます。

したがって、assemblyinfo.csを開いて手動で実行してください。

149
Hath

各ビルドでバージョン番号を変更するためのもう1つの選択肢は、 MSBuild.Community.TasksVersionタスクを使用することです。インストーラをダウンロードしてインストールした後、次のコードを修正して.csprojファイルの<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />の後に貼り付けるだけです。

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

注:StartDateプロパティを自分のロケールに合わせます。 現在、不変カルチャは使用されていません。

2010年1月14日の3回目のビルドでは、次の内容のVersionInfo.csが作成されます。

[Assembly: AssemblyVersion("1.0")]
[Assembly: AssemblyFileVersion("1.0.14.2")]

その後、このファイルをプロジェクトに追加し(既存の項目を追加する)、AssemblyVersion行とAssemblyFileVersion行をAssemblyInfo.csから削除する必要があります。

バージョンコンポーネントを変更するためのさまざまなアルゴリズムは、$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chmおよびバージョンプロパティで説明されています。

52
Christian

私はクリスチャンに似た解決策を思いついたが、コミュニティのMSBuildタスクに頼らずに、私のすべての開発者にこれらのタスクをインストールしたくないのでこれは私にとって選択肢ではない。

私はコードを生成してアセンブリにコンパイルしていて、バージョン番号を自動インクリメントしたいです。しかし、VS 6.0。* AssemblyVersionトリックは毎日ビルド番号を自動インクリメントし、古いビルド番号を使用しているアセンブリとの互換性がなくなるので使用できません。代わりに、ハードコードされたAssemblyVersionと自動増分するAssemblyFileVersionが必要です。私はAssemblyInfo.csでAssemblyVersionを指定し、このようにMSBuildでVersionInfo.csを生成することによってこれを達成しました、

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[Assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

これにより、AssemblyFileVersionのAssembly属性を持つVersionInfo.csファイルが生成されます。ここで、バージョンはビルド日付を持つYY.MM.DD.TTTTのスキーマに従います。このファイルをプロジェクトに含めてビルドする必要があります。

24
Boog

Build Version Increment アドインをインストールしてください。それはあなたに*オプションよりもはるかに多くのコントロールを与えます。

16
null

バージョン番号を取得するには

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = Assembly.GetName();
 Version version = assemblyName.Version;

バージョン番号を設定するには、AssemblyInfo.csを作成/編集します。

 [Assembly: AssemblyVersion("1.0.*")]
 [Assembly: AssemblyFileVersion("1.0.*")]

また、3番目の数字は2000年2月1日以降の日数で、4番目の数字はその日の合計秒数の半分です。あなたが深夜にコンパイルするなら、それはゼロになるはずです。

12
Bob

Visual Studioの拡張機能があります 自動バージョン これは、Visual Studio 2012、2013、2015、および2017をサポートします。

スクリーンショットenter image description here

enter image description here

9
Rahul

他の記事で説明されているように、AssemblyInfoまたはプロジェクトプロパティのバージョン番号に*を設定しても、Visual Studio/.NETのすべてのバージョンで機能するわけではありません。

VS 2005では機能しませんでした(VS 2003およびVS 2008では機能しませんでした)。 VS 2005の場合は、次のものを使用できます。 コンパイル時にVisual Studio 2005バージョンのビルドとリビジョン番号を自動増分する

ただし、厳密な名前のアセンブリにはバージョン番号を自動的に変更することはお勧めできません。その理由は、厳密な名前のアセンブリ参照は常に特定のアセンブリバージョンへの参照であるため、参照されたアセンブリが再構築されるたびに、そのようなアセンブリへのすべての参照を更新する必要があるためです。マイクロソフト自身が.NET Frameworkアセンブリのバージョン番号を変更するのは、インターフェイスに変更がある場合だけです。 (注:私はまだそれを読んでいるMSDNのリンクを探しています。)

8
Dirk Vollmar

(DateTime)情報を増加させてAssemblyFileVersionプロパティにすること。依存関係を壊さないという利点があります。


Boogのソリューション(私にとってはうまくいかなかった、おそらくVS2008のせいか?)を基にして、ファイルを生成し、そのファイルを追加し(そしてそのバージョン属性を含む)そして読み上げる方法を使用することができます。これらの値あれは..

ビルド前イベント:

echo [Assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

結果のVersionInfo.csファイル([プロパティ]サブフォルダー)をプロジェクトに含めます

日付を戻すためのコード(年までの秒数):

var version = Assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(Assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

あまり快適ではありません。また、ファイルが常に変更されるため、大量の強制再構築が行われるかどうかもわかりません。

たとえば、VersionInfo.csファイルを数分/時間ごとに更新するだけの場合(一時ファイルを使用して、十分な大きさの変更が検出された場合は実際のVersionInfo.csをコピー/上書きするなど)に、よりスマートにできます。私はこれをかなりうまくやった。

6
Andreas Reiff

バージョン番号を "1.0。*"に設定すると、最後の2つの数字に日付(ある時点からの日数)と時間(午前0時からの秒数の半分)が自動的に入ります

5
James Curran

Cake はAssemblyInfoファイルのパッチ適用をサポートします。ケーキを手にすると、自動バージョンインクリメントを実装する無限の方法があります。

C#コンパイラのような増分バージョンの簡単な例は、

Setup(() =>
{
    // Executed BEFORE the first task.
    var datetimeNow = DateTime.Now;
    var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
    var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
    var assemblyInfo = new AssemblyInfoSettings
    {
        Version = "3.0.0.0",
        FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
    };
    CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

ここに:

  • バージョン - アセンブリのバージョンです。ベストプラクティスは、メジャーバージョン番号をロックし、残りをゼロのままにすることです( "1.0.0.0"など)。
  • FileVersion - アセンブリファイルのバージョンです。

バージョンだけでなく 他のすべての必要な情報 もパッチを適用できることに注意してください。

4
hal

プロジェクトプロパティの発行にあります。

http://screencast.com/t/Vj7rhqJO
(〜 http://screencast.com/t/Vj7rhqJO

4
Alex

プロジェクトへ[プロパティ]、[アセンブリ情報]、[アセンブリバージョン]の順にクリックし、最後または最後から2番目のボックスに*を付けます(メジャーコンポーネントまたはマイナーコンポーネントを自動インクリメントすることはできません)。

3
MusiGenesis

バージョン{major}.{year}.1{date}.1{time}を取得する方法

これは実験的なものですが、私は好きです。 Jeff Atwood @ CodingHorror( link )に触発されました。

結果のバージョン番号は1.2016.10709.11641(意味2016-07-09 16:41)になります。

  • 貧しい人はゼロパディングを(愚かな先頭の1sで)
  • 読みやすいローカルバージョン番号に埋め込まれたDateTime
  • 重大な重大な変更のためにメジャーバージョンだけを残します。

プロジェクトに新しい項目を追加して、[一般] - > [テキストテンプレート]を選択し、CustomVersionNumberのような名前を付け、(該当する場合)Properties/AssemblyInfo.csAssemblyVersionAssemblyFileVersionをコメントアウトします。

次に、このファイルを保存するとき、またはプロジェクトをビルドするときに、作成された.csファイルの下のサブ項目として配置されている.ttファイルが再生成されます。

<#@ template language="C#" #>
<#@ Assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[Assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[Assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
2
user3638471

今のところ、私のアプリケーションでは、

string ver = Application.ProductVersion;

ver = 1.0.3251.27860を返します

値3251は、1/1/2000以降の日数です。私はそれを使って私のアプリケーションのスプラッシュスクリーンにバージョン作成日を入れます。ユーザーと取引するとき、私はある長い番号よりも通信しやすい作成日を尋ねることができます。

(私は中小企業をサポートする一人称の部署です。このアプローチはあなたにとってうまくいかないかもしれません。)

2
SeaDrive

MSBuild Community Tasks( http://msbuildtasks.tigris.org/ )プロジェクトのAssemblyInfoタスクを使用して、それを.csproj/.vbprojファイルに統合します。

バージョン番号を日付と時刻に結び付けるなど、さまざまなオプションがあります。

おすすめです。

2
devstuff

AssemblyInfoの変更はVS2012で機能します。 Visual Studioでこれ以上のサポートがないことは不思議に思えます。これはビルド/リリースプロセスの基本部分であると思うでしょう。

2
Maxcelcat

AssemblyInfoUtil 無料です。オープンソース。

1
Sergiy

ここで答えるには遅すぎるかもしれませんが、それが誰かの多忙な問題を解決することを願っています。

PowerShellスクリプトを使用してすべてのプロジェクトのアセンブリバージョンを変更するための自動方法。 この記事 あなたの問題の多くを解決します。

1
Khawaja Asim

私はこのアプローチを使用しています https://stackoverflow.com/a/827209/3975786 T4テンプレートを[Solution Items]に配置し、各プロジェクト内で[Add as Link]と共に使用します。

1
mcandal

たぶん、このタスクのために、あなたはこのようなコードを使うことができます:

    private bool IncreaseFileVersionBuild()
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            try
            {
                var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
                var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
                string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
                System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[Assembly: AssemblyFileVersion(\"" + ol + "\")]", "[Assembly: AssemblyFileVersion(\"" + ne + "\")]"));
                return true;
            }
            catch
            {
                return false;
            }
        }
        return false;
    }

そしてフォームの読み込みから呼び出します。
このコードを使用すると、AssemblyInfo.cs内のファイル情報の任意の部分を更新できます(ただし、「標準」ディレクトリ構造を使用する必要があります)。

1
Atiris

ファイルのバージョンを自動的にインクリメントするアプリケーションを作成しました。

  1. ダウンロード アプリケーション
  2. 次の行をビルド前のイベントのコマンドラインに追加します。

    C:\ temp\IncrementFileVersion.exe $(SolutionDir)\ Properties\AssemblyInfo.cs

  3. プロジェクトを構築する

それを簡単に保つために、アプリはエラーがある場合にメッセージを投げるだけです、それがうまく働いたことを確認するためにあなたは「アセンブリ情報」のファイルバージョンをチェックする必要があるでしょう

注:フィールドに値を入力するには、「Assembly Information」ボタンのためにVisual Studioのソリューションを再ロードする必要がありますが、出力ファイルには更新されたバージョンがあります。

ご提案やご要望は[email protected]までメールをください。

0
Telson Alva

ビルドするたびに、最下位桁が自動的に増分されます。

他の人を更新する方法はわかりませんが、少なくともそれをすでに確認している必要があります...

0
Brian Knoblauch

Visual Studioの場合2019年

追加するには不十分でした

[Assembly: AssemblyVersion("1.0.*")]

構築時にこのエラーが発生します

指定されたバージョン文字列が必要なフォーマットに準拠していません

溶液

project.csprojDeterministicFalseに設定した後、フォーマットはついに受け入れられました

<Deterministic>false</Deterministic>

編集する

何らかの理由でDeterministicFalseに設定すると、設定ファイルが読み込まれて別の場所に保存されてしまいました。

回避策:

リビジョン番号を増やすためにビルド後のイベントを設定します。

ビルド後イベントバッチスクリプト

これはautoincrement_version.ps1のパスを引数として渡してAssemblyInfo.csという名前のpowershellスクリプトを呼び出します。

if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)

Poweshellスクリプト

Regexを使ってリビジョン番号を自動インクリメントします

param( [string]$file );
  $regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
  $found = (Get-Content $file) | Select-String -Pattern $regex_revision
  $revision = $found.matches[0].value
  $new_revision = [int]$revision + 1
  (Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8
0
Madacol