いつブロ

いつまで続くか分からないブログ(仮)主に趣味やプログラミングに関するメモを書いています。

Directory.Build.props を使った「複数プロジェクトのバージョン一括管理」入門

Directory.Build.props を使った「複数プロジェクトのバージョン一括管理」入門

〜実は公式サポートされている標準機能です〜

.NET のソリューションを複数プロジェクトで構成していると、 こんな悩みにぶつかったことはありませんか?

  • バージョン番号を変更するたびに、すべての .csproj を修正している
  • NuGet パッケージと AssemblyVersion がズレる
  • テスト用・サンプル用プロジェクトだけ更新し忘れる
  • MSIX / Store 提出時のバージョン管理が地獄

実はこれ、MSBuild の公式機能で綺麗に解決できます。


結論:Directory.Build.props を使えば一発です

Directory.Build.props を使うことで、

  • 複数プロジェクトの バージョン情報を一括管理
  • .csproj を汚さずに共通設定を集約
  • CI / NuGet / MSIX すべてに自然に反映

が可能になります。

しかもこれは 裏技でもハックでもなく、公式仕様です。
(Filesのソースを見ていて気が付きました。)


Directory.Build.props とは?

Directory.Build.props は、 MSBuild が自動的に読み込む共通設定ファイルです。

特徴はとてもシンプル:

  • ソリューション直下(または親フォルダ)に置くだけ
  • 配下のすべての SDK-style project に自動適用
  • 各 .csproj に Import を書く必要なし

MSBuild automatically imports Directory.Build.props if it exists in the directory tree.

これは Microsoft の公式ドキュメントにも明記されています。


なぜ知られていないのか?

理由はだいたいこのあたりです:

  • 単一プロジェクトでは恩恵が少ない
  • Visual Studio が自動生成してくれない
  • 既存プロジェクトでは後から気づきにくい
  • 「非公式テクニック」と誤解されがち

しかし実際には、 Microsoft 自身が大規模ソリューションで前提として使っている仕組みです。


実践:バージョンを一括管理する

Directory.Build.props(例)

<Project>
  <PropertyGroup>
    <!-- NuGet / アプリ全体のバージョン -->
    <Version>1.2.3</Version>

    <!-- Assembly 情報 -->
    <AssemblyVersion>1.2.0.0</AssemblyVersion>
    <FileVersion>1.2.3.0</FileVersion>
    <InformationalVersion>1.2.3</InformationalVersion>
  </PropertyGroup>
</Project>

これだけで:

  • すべてのプロジェクトのバージョンが統一
  • dotnet build
  • dotnet pack
  • dotnet publish

すべてに自動反映されます。


csproj 側はどうなる?

何も書かなくてOKです。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
  </PropertyGroup>
</Project>

バージョン情報は Directory.Build.props から流れ込んできます。


Debug / Release でバージョンを分けたい場合

これも公式に想定されている使い方です。

<PropertyGroup>
  <VersionPrefix>1.2.3</VersionPrefix>
  <VersionSuffix Condition="'$(Configuration)' == 'Debug'">dev</VersionSuffix>
</PropertyGroup>
  • Debug → 1.2.3-dev
  • Release → 1.2.3

CI との相性も抜群です。


NuGet / MSIX / Store 提出でも有効?

はい。むしろ必須レベルです。

  • NuGet パッケージの Version
  • Assembly 情報
  • MSIX のバージョン管理
  • Store 再提出時の更新漏れ防止

すべて 1 ファイルで制御できます。


よくある誤解

❌ 非公式テクニック?

→ いいえ。MSBuild の正式仕様です

❌ Visual Studio 専用?

→ いいえ。CLI / CI / GitHub Actions でも同じ挙動

❌ 将来壊れそう?

→ Microsoft 自身が前提としているため極めて安全


まとめ

  • Directory.Build.props は 公式サポートされている標準機能
  • 複数プロジェクト構成では 使わない理由がない
  • バージョン管理・CI・配布が一気に楽になる

「知らなかった…」という人ほど、 今日から導入すると幸せになれます。


参考リンク(公式)


宣伝

個人開発でも Directory.Build.props を使ってバージョン管理しています。

GitHubのContoributionを簡単にシェアできるアプリを作りました。
この記事が役に立ったという方はぜひお試しください。 apps.microsoft.com

Windows11標準のエクスプローラーよりも高速に動くエクスプローラーを作りました。あのFilesよりも高速です。 apps.microsoft.com