-
Notifications
You must be signed in to change notification settings - Fork 0
MS_DotNetAssemblyVersion
- 戻る(.NETアセンブリ)
.NET Standard、.NET Core での
設定方法を調査しがてら作成してみた。
AssemblyVersion(.NET Standard、.NET Core では Version)
を指定して、NuGet パッケージ(NuGetパッケージの開発と公開)の
バージョンと一致させておけばよさそう。
補足(結論から言うと): 現在の SDK 形式プロジェクトでは、
<Version>を 1 つ書けば他はすべて追随する。
以下の 3 種・4 種の使い分けは、
意図的に別々の値にしたい場合にだけ必要になる。<PropertyGroup> <Version>1.2.3</Version> <!-- これだけで足りることが多い --> </PropertyGroup>
major.minor.build.revision の形式で付与する。
変更の意味
- 新バージョンが以前のバージョンと大きく異なる。
- 後方互換性が失われている可能性が高い。
変更の意味
-
かなりの変更がなされたが、
可能なかぎり後方互換性が保たれている。 -
後方互換性
- 以前のバージョンに無かった機能を含めることができる。
- しかし、旧い機能は改訂によって影響を受けてはいけない。
変更の意味
- リビジョンがバグ修正のための必須のアップグレードであり、
必ずインストールすべきことを意味する。 - クイック フィックス エンジニアリング (QFE) のバグ修正版は
前のバージョンと互換性を保つ必要がある。
変更の意味
変更は、小さな変更のみがなされ、新バージョンは、
依然として後方互換性を保っていることを意味する。
※ NuGet のバージョン番号(NuGetパッケージの開発と公開)には存在しない。
補足(.NET 方式とセマンティック バージョニングの対応): .NET の
4 桁方式と、NuGet が採る **SemVer(3 桁 + プレリリース)**は
桁数が違うため、対応関係を押さえておく必要がある。【.NET】 major . minor . build . revision 【SemVer】MAJOR . MINOR . PATCH [-プレリリース] 例: 1.2.3-beta.1
.NET の 4 桁 SemVer 互換性を壊す major MAJOR 機能追加(互換あり) minor MINOR バグ修正 build PATCH 微修正 revision 無し(プレリリース タグで表現) 原文の「NuGet のバージョン番号には revision が存在しない」は
SemVer が 3 桁だからである。
したがって、NuGet パッケージを出すライブラリでは
<Version>を SemVer(3 桁)で書くのが素直で、
AssemblyVersion側は 4 桁目が 0 で補われる。なお、
AssemblyVersionは不用意に上げないのが定石である
(後述のとおり、これが変わると参照側の再ビルドや
バインディング リダイレクトが必要になるため)。
実務では次のようにすることが多い。<Version>1.2.3</Version> <!-- NuGet / 表示用 --> <AssemblyVersion>1.0.0.0</AssemblyVersion> <!-- メジャー内で固定 -->
-
アセンブリのバージョン。
-
CLR が使用する。
- GAC(グローバル・アセンブリ・キャッシュ)
- アセンブリ バージョンのリダイレクト
-
使用方法
- major.minor.build.revision の形式
- build と revision にはワイルドカード(
*)を
指定すると、コンパイラに自動的に値を決定する。 - AssemblyVersion のみを設定した場合、
他の 2 つのバージョンも同じ値になる。
-
ファイルのバージョン
-
以下で使用される。
- Win32 EXE/DLL としてのバージョン。
- プロパティ・ダイアログで表示されるファイルバージョン
-
使用方法
- major.minor.build.revision の形式
- AssemblyFileVersion のみ設定した場合、
他の 2 つのバージョンも同じ値になる。
-
ユーザー向けに表示される追加的なバージョン情報(製品バージョン)
-
使用方法
- major.minor.build.revision 以外の形式
- 他にも任意の文字列を指定できる。
- AssemblyInformationalVersion のみ設定した場合、
他の 2 つのバージョンは 0.0.0.0 になる。
補足(3 つの使い分けが重要な理由): 見た目が似ているが、
誰が見るかがまったく違う。
誰が使うか 変えると何が起きるか AssemblyVersion CLR(実行時のバインド) 参照側が壊れる。再ビルドかリダイレクトが要る AssemblyFileVersion 人・OS(エクスプローラーのプロパティ) 何も壊れない(表示が変わるだけ) AssemblyInformationalVersion 人(製品バージョン表示) 何も壊れない。文字列可( 1.2.3-beta+sha)AssemblyVersion 1.0.0.0 ← 固定しておく(互換のある範囲では変えない) FileVersion 1.2.3.456 ← ビルドごとに上げてよい InformationalVer 1.2.3-beta.1+abc1234 ← Git のコミット ハッシュ等を含めても可ビルドのたびに
AssemblyVersionを上げる設定にすると、
参照している全アセンブリの再ビルドが必要になり、
NuGet のMSB3247(バージョン競合)を招く。
ワイルドカード1.0.*は、まさにこれをやってしまうため、
ライブラリでは避けるべきである。
.NET Standard、.NET Core では、
*.csproj に移動になっている模様。
すべてのバージョン番号の既定値になる値。
- ≒ AssemblyVersion
- 既定値は、Version に一致する。
- ≒ AssemblyFileVersion
- 既定値は、Version に一致する。
- NuGet パッケージの生成に使用される。
- 既定値は、Version に一致する。
補足(AssemblyInfo.cs が消えた): SDK 形式のプロジェクトでは、
AssemblyInfo.csが自動生成されるようになった。
このため、旧形式から移行した際に
**「同じ属性が二重定義されている」というエラー(CS0579)**が出ることがある。<!-- 旧 AssemblyInfo.cs を残したい場合 --> <PropertyGroup> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>通常は
AssemblyInfo.csを削除して.csprojに集約するのが正しい。補足(CI でバージョンを注入する): 実務では、
ソースにバージョンを書かず、ビルド時に渡すことが多い。dotnet build -c Release -p:Version=1.2.3 -p:InformationalVersion=1.2.3+$GIT_SHAMinVer や Nerdbank.GitVersioning といったツールを使うと、
Git のタグ / コミット数から自動的にバージョンを決定できる。
- バージョン番号の付け方(.NET)
https://www.barukichi.com/blogs/barulog.php?itemid=1114
-
アセンブリのバージョン情報を取得する - Programming/.NET Framework/Tips - 総武ソフトウェア推進所
https://smdn.jp/programming/netfx/tips/get_assembly_version_info/ -
.NET のコンパイラーとバージョン情報 - 捨てられたブログ
https://blog.recyclebin.jp/archives/3991 -
アセンブリが持つ 3 つのバージョンの意味 - Caronte
http://yuh.hatenadiary.jp/entry/2014/07/19/100718 -
アセンブリ・バージョンとファイル・バージョンを一致させるには?[VS 2005 のみ、C#、VB] - @IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/664setsamevesion/setsamevesion.html
.NET Standard、.NET Core - Stack Overflow
-
Do I need AssemblyInfo while working with .NET Core?
https://stackoverflow.com/questions/39163558/do-i-need-assemblyinfo-while-working-with-net-core- visual studio - Equivalent to AssemblyInfo in dotnet core/csproj
https://stackoverflow.com/questions/42138418/equivalent-to-assemblyinfo-in-dotnet-core-csproj
- visual studio - Equivalent to AssemblyInfo in dotnet core/csproj
-
.NET Core の csproj 形式に追加されたもの
https://learn.microsoft.com/ja-jp/dotnet/core/project-sdk/msbuild-props
Tags: 移行, .NET開発
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。