.NET Core のプロジェクトでなんか作っててもバージョン情報は、csproj でちょいちょいーっとしか管理してなかったので多少なりとも知っておきたいなーと感じました。
とゆーことで最近(NuGet 4.0 以降、MSBuild 15.1 以降)の.NET Core でのバージョン管理を整理してみました。
csporj でのバージョン設定
Nuget でリリーしたときに見れるバージョンとか dll とか右クリックして確認できるバージョンは、基本的に csporj で管理されます。

それをどうやって書くかというと、csporj の PropertyGroup 内で設定する項目として Version、VersionPrefix、VersionSuffix の3つの関係性を把握しておけば大丈夫です。
バージョンのフォーマットは基本的に Semantic Versioning の規約に従っています。
この3つについて csproj 書いて表示される際のルールを整理します。
VersionPefix
| Format | 例 |
|---|---|
| major.minor.patch | 1.2.35 0.1.0 |
デフォルト値は 1.0.0 です。
VersionSuffix や VersionPefix の値次第でバージョンの表示が異なります。詳しくは後述の Version のとこで書きます。
VersionSuffix
| Format | 例 |
|---|---|
| [0-9A-Za-z-] | beta rc-3-build20190603 |
主にプレビューとかプレリリースのラベルを付けるためのもので任意の文字列をセットできます。Nuget とか npm でもよくみそうなやつですね。
VersionSuffix や VersionPefix の値次第でバージョンの表示が異なります。詳しくは後述の Version のとこで書きます。
Version
| Format | 例 |
|---|---|
| major.minor.patch[-prerelease] | 5.3.9-beta 0.0.1-alpha-01, 2.0.0 |
特に何もしないとこのVersion が csproj に書かれています。デフォルト値は 1.0.0 になっています。[-prerelease] の値はオプションなのであっても無くてもよいです。
Version が csproj に明示的に書かれている場合は、その値が反映されます。
csproj から Version を消して、VersionPefix と VersionSuffix を使うことができます。
その場合、実際に表示されるバージョンには以下のルールがあります。
- VersionSuffix が empty の場合: VersionPrefix の値
- VersionSuffix が empty でない場合: VersionPrefix-VersionSuffix
VersionPrefix = 1.0.0 で VersionSuffix = beta だったら Version = 1.0.0-beta となります。
実用的なイメージの例として、Visual Studio からNuget Pakcage 作るときのコマンドや、Build piplineで Nuget Package 作るときの yaml の定義で VersionSuffix を引数で渡してあげるとかできます。
また、どうでもよい情報として、
- Version, VersionSuffix, VersionPrefix すべてがないと、
1.0.0になります。 - VersionPrefix しかない場合、
1.0.0+ "-" + VersionPrefixの値になります。
この条件に該当してたらもはや管理する気ないだろってやつですね。
その他のバージョン情報
ライブラリやアプリを見ると、PackageVersion, AssemblyVersion, FileVersion, InformationalVersion があります。設定してなくても表示されますが、これってなんぞや?を見てみます。
PackageVersion
| Format | 例 |
|---|---|
| major.minor.patch[-prerelease] | 5.3.9-beta 0.0.1-alpha-01, 2.0.0 |
Nuget の Package のバージョンで表示されるやつですね。明示的に設定していない場合、Version が表示されます。
AssemblyVersion
| Format | 例 |
|---|---|
| major.minor.patch.revision | 4.5.6.2 1.0.0.0 |
System.Reflection.AssemblyVersionAttribute の値として使われるやつです。詳しくは公式ドキュメントのこちら。
デフォルト値は、Version の [-prelelease] の部分を抜いたもです。
FileVersion
| Format | 例 |
|---|---|
| major.minor.patch.buildnumber | 1.0.0.43952 0.1.0.0 |
System.Reflection.AssemblyFileVersionAttribute の値として使われます。
デフォルト値は、AssemblyVersion です。
InformationalVersion
これは、System.Reflection.AssemblyInformationalVersionAttribute で使われる値です。フォーマットはなんでもよいみたいですね。
デフォルト値は、Version です。