BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

csproj のバージョン 管理 について

.NET Core のプロジェクトでなんか作っててもバージョン情報は、csproj でちょいちょいーっとしか管理してなかったので多少なりとも知っておきたいなーと感じました。

とゆーことで最近(NuGet 4.0 以降、MSBuild 15.1 以降)の.NET Core でのバージョン管理を整理してみました。

csporj でのバージョン設定

Nuget でリリーしたときに見れるバージョンとか dll とか右クリックして確認できるバージョンは、基本的に csporj で管理されます。

f:id:beachside:20190606110618p:plain

それをどうやって書くかというと、csporj の PropertyGroup 内で設定する項目として VersionVersionPrefixVersionSuffix の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 を消して、VersionPefixVersionSuffix を使うことができます。
その場合、実際に表示されるバージョンには以下のルールがあります。

  • VersionSuffix が empty の場合: VersionPrefix の値
  • VersionSuffix が empty でない場合: VersionPrefix-VersionSuffix

VersionPrefix = 1.0.0VersionSuffix = 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 です。


参考