MSBuild

Microsoft Build Engine は、アプリケーションをビルドするためのプラットフォームです。 MSBuild とも呼ばれるこのエンジンには、ビルド プラットフォームでソフトウェアを処理およびビルドする方法を制御する、プロジェクト ファイル用の XML スキーマが用意されています。 Visual Studio は MSBuild を使用しますが、MSBuild は Visual Studio に依存しません。 プロジェクト ファイルまたはソリューション ファイルに対して msbuild.exe または dotnet build を実行すると、Visual Studio がインストールされていない環境で、製品の統合とビルドを実行できます。

Visual Studio は、マネージド プロジェクトの読み込みとビルドを行う MSBuild をホストしています。 Visual Studio のプロジェクト ファイル ( .csprojvbprojvcxproj など) には、IDE を使用してプロジェクトをビルドするときに実行される MSBuild XML コードが含まれています。 Visual Studio プロジェクトには、一般的な開発作業を行う必要なすべての設定とビルド プロセスがインポートされますが、Visual Studio 内のエディターや任意の XML エディターを使用してそれらを拡張または変更することもできます。

Visual Studio のない Windows システムに MSBuild をインストールするには、ダウンロード ページ[Build Tools for Visual Studio 2022] にアクセスしてください。 この方法で MSBuild をインストールすると、MSBuild.exe が提供されます。

.NET Core および .NET 5 以降の場合、MSBuild と同等の機能を得るもう 1 つの方法は .NET SDK をインストールすることです。 .NET ビルド コマンド dotnet build は、macOS、Windows または Linux 上の .NET SDK で利用できます。 .NET ビルド コマンド dotnet build は、.NET Core バージョンの MSBuild.exe に対するシン ラッパーです。 また、MSBuild を使用する .NET Core コマンドライン インターフェイス (CLI) を使用して、.NET Core と .NET 5 以降を対象とするプロジェクトをビルドできます。

Visual Studio 2022 以降、Visual Studio でビルドする場合は、64 ビット バージョンの MSBuild が使用されます。

C++ に対する MSBuild の詳細については、「MSBuild (C++)」をご覧ください。

次の例では、Visual Studio IDE ではなくコマンド ラインから MSBuild を呼び出してビルドを実行する状況について説明します。

  • Visual Studio 2013 がインストールされていません。

  • 64 ビット バージョンの MSBuild の使用を希望しています。Visual Studio 2019 またはそれ以前を使用しています。 通常は MSBuild のこのバージョンは不要ですが、このバージョンを使用すると、MSBuild はより多くのメモリにアクセスできます。

  • 複数のプロセスでビルドを実行することを希望しています。 ただし、C++ および C# で記述したプロジェクトに関しては、同じ結果を達成するために IDE を使用することもできます。

  • ビルド システムを変更することを希望しています。 たとえば、次の操作を有効にすることを希望する場合があります。

    • コンパイラに渡す前に、ファイルを前処理します。

    • ビルド出力を別の場所にコピーします。

    • ビルド出力から圧縮ファイルを作成します。

    • 後処理手順を実行します。 たとえば、1 つのアセンブリに対して、異なる複数のバージョンをスタンプとして割り当てることがあります。

Visual Studio IDE でコードを作成し、MSBuild を使用してビルドを実行することもできます。 別の方法として、開発用コンピューターの IDE でコードをビルドすることもできますが、コマンド ラインから MSBuild を実行して、複数の開発者のコラボレーションによるソース リポジトリから統合されたコードをビルドすることもできます。

Note

Azure Pipelines を使用して、アプリケーションを自動的にコンパイル、テスト、および配置することができます。 開発者がコードをチェックインしたとき (たとえば、継続的インテグレーションの手法の一環として)、またはスケジュールに従って (たとえば、夜間のビルド確認テストの一部として)、ビルド システムがビルドを自動的に実行ですることもできます。 Azure Pipelines では MSBuild を使用してコードをコンパイルします。 詳細については、「Azure Pipelines」を参照してください。

Windows の MSBuild の入門チュートリアルについては、「チュートリアル: MSBuild の使用」を参照してください。

コマンド プロンプトでの MSBuild の使用

MSBuild をコマンド プロンプトで実行するには、適切なコマンド ライン オプションと共に、プロジェクト ファイルを MSBuild.exe に渡します。 コマンド ライン オプションでは、プロパティを設定したり、特定のターゲットを実行したりできるほか、ビルド処理を制御するその他のオプションも設定できます。 たとえば、Configuration プロパティを Debug に設定して MyProj.proj ファイルをビルドするには、次のコマンド ライン構文を使用します。

MSBuild.exe MyProj.proj -property:Configuration=Debug

MSBuild は、ファイル拡張子に基づいて動作を変更しませんが、規則として、"プロジェクト ファイル" と呼ばれるメイン MSBuild 入力ファイルに対して、proj で終わる拡張子 (.csproj.vcxproj、または .vbproj など) を使用します。

MSBuild のコマンド ライン オプションの詳細については、コマンド ライン リファレンスをご覧ください。

重要

プロジェクトをダウンロードする前に、コードが信頼できるものかどうかを確認してください。

.NET Core および .NET 5 以降の場合、通常、dotnet build を使用して MSBuild を呼び出します。 「dotnet build」を参照してください。 Visual Studio や Visual Studio Build Tools ではなく、.NET SDK のみをインストールする場合は、dotnet build を介してのみ MSBuild を使用できます。

コマンド ライン dotnet build --help には、dotnet build に固有のコマンド ライン オプションが一覧表示されますが、MSBuild.exe のすべてのオプションではありませんが、MSBuild コマンド ライン リファレンスに記載されているすべてのコマンド ライン オプションを引き続き使用できます。 dotnet build によって処理されないオプションは、MSBuild に渡されます。

プロジェクト ファイル

MSBuild では、簡単で拡張性がある XML ベースのプロジェクト ファイル形式が使用されています。 MSBuild のプロジェクト ファイル形式では、ビルドする項目のほか、それらをさまざまなオペレーティング システムや構成用にビルドする方法も、開発者が指定できます。 また、異なるファイルに適用できるビルド規則を記述しておき、製品を構成するさまざまなプロジェクトで再利用することにより、一貫したビルド作業を行うことができます。

Visual Studio ビルド システムにより、プロジェクト固有のロジックはプロジェクト ファイル自体に格納されます。また、標準のビルド ロジックを定義するために .props.targets などの拡張子を持つインポートされた MSBuild XML ファイルが使用されます。 .props ファイルには MSBuild のプロパティが定義され、 .targets ファイルには MSBuild のターゲットが定義されます。 これらのインポートは、Visual Studio のプロジェクト ファイルに表示されることもありますが、.NET Core、.NET 5、.NET 6 プロジェクトなどの新しいプロジェクトでは、プロジェクト ファイルにインポートが表示されず、代わりに SDK の参照が次のように表示されます。

<Project Sdk="Microsoft.Net.Sdk">

これらは SDK スタイルのプロジェクトと呼ばれます。 .NET SDK などの SDK を参照すると、.props ファイルと .target ファイルのインポートは SDK によって暗黙的に指定されます。

以下のセクションでは、MSBuild プロジェクト ファイル形式のいくつかの基本要素について説明します。 基本的なプロジェクト ファイルを作成する方法のチュートリアルについては、チュートリアル:MSBuild プロジェクト ファイルのゼロからの作成に関するページを参照してください。

プロパティ

プロパティはビルドを設定するためのキーと値のペアです。 プロパティを宣言するには、そのプロパティの名前を持つ要素を PropertyGroup 要素の子として作成します。 たとえば、次の コードでは、BuildDir という名前のプロパティを作成し、Build を値として設定しています。

<PropertyGroup>
    <BuildDir>Build</BuildDir>
</PropertyGroup>

要素内に Condition 属性を配置して、プロパティを条件付きで定義することもできます。 条件が true と評価されないと、条件付き要素の内容は無視されます。 次の例では、Configuration プロパティがまだ定義されていない場合に定義されます。

<Configuration  Condition=" '$(Configuration)' == '' ">DefaultValue</Configuration>

プロジェクト ファイルでプロパティを参照するには、$(<PropertyName>) という構文を使用します。 たとえば、前の例に示したプロパティを参照するには、$(BuildDir) および $(Configuration) と記述します。

プロパティの詳細については、「MSBuild プロパティ」をご覧ください。

アイテム

項目はビルド システムへの入力であり、通常はファイルを表します。 項目はユーザー定義の項目名に基づいて項目の種類にグループ化されます。 これらの項目の種類は、タスクのパラメーターとして使用できます。タスクでは、個々の項目を使用してビルド処理の各ステップを実行します。

項目は、その項目の種類名を名前に持つ要素を、ItemGroup 要素の子として作成することにより、プロジェクト ファイルで宣言します。 たとえば、次のコードでは、Compile という名前の項目の種類を作成し、2 つのファイルを含めています。

<ItemGroup>
    <Compile Include = "file1.cs"/>
    <Compile Include = "file2.cs"/>
</ItemGroup>

プロジェクト ファイルで項目の種類を参照するには、@(<ItemType>) という構文を使用します。 たとえば、この例に示した項目の種類を参照するには、@(Compile) と記述します。

MSBuild では、要素名および属性名では大文字と小文字が区別されますが、 プロパティ名、項目名、メタデータ名では、大文字と小文字は区別されません。 次の例では、CompilecomPile、または大文字小文字が異なるさらに別の項目の種類のいずれかを作成し、項目の種類に対して "one.cs;two.cs" という値を割り当てます。

<ItemGroup>
  <Compile Include="one.cs" />
  <Compile Include="two.cs" />
</ItemGroup>

項目はワイルドカード文字を使って宣言できるほか、メタデータを追加することで、より高度なビルド作業を行うことができます。 項目の詳細については、「項目」をご覧ください。

タスク

タスクとは、MSBuild プロジェクトでビルド処理を実行するために使用される実行可能コードの単位です。 たとえば、タスクでは入力ファイルをコンパイルしたり、外部ツールを実行したりします。 タスクは再利用が可能で、複数の開発者が複数のプロジェクトで共有できます。

タスクの実行ロジックはマネージド コードで記述され、UsingTask 要素を使用して MSBuild にマップされます。 ITask インターフェイスを実装するマネージド型を記述することにより、独自のタスクを作成できます。 タスクを記述する方法の詳細については、「タスクの作成」をご覧ください。

MSBuild には、ご自分の要件に合わせて変更できる一般的なタスクが含まれています。 例は、ファイルをコピーする Copy、ディレクトリを作成する MakeDir、Visual C# ソース コード ファイルをコンパイルする Csc などです。 使用可能なタスクと使用法については、「タスク リファレンス」をご覧ください。

MSBuild プロジェクト ファイルでタスクを実行するには、そのタスクの名前を持つ要素を、Target 要素の子として作成します。 一般に、タスクは、要素の属性として渡されるパラメーターを受け取ります。 MSBuild のプロパティと項目の両方をパラメーターとして使用できます。 たとえば、次のコードでは、MakeDir タスクを呼び出し、先ほどの例で宣言した BuildDir プロパティの値を渡しています。

<Target Name="MakeBuildDirectory">
    <MakeDir  Directories="$(BuildDir)" />
</Target>

タスクの詳細については、「MSBuild タスク」をご覧ください。

対象サーバー

ターゲットは、タスクを特定の順序でグループ化し、プロジェクト ファイルの各セクションを、ビルド プロセスのエントリ ポイントとして公開する役割を果たします。 読みやすさや拡張性を高める目的で、複数のターゲットを論理的なセクションとしてグループ化することもできます。 ビルド ステップを複数のターゲットに分割することにより、他のターゲットから、一部のビルド処理だけを呼び出すことができ、そのコード セクションをすべてのターゲットに逐一コピーする手間をなくすことができます。 たとえば、ビルド処理の複数のエントリ ポイントで、参照をビルドする必要がある場合、参照をビルドするターゲットを作成しておけば、必要なすべてのエントリ ポイントからそのターゲットを実行できます。

ターゲットは、プロジェクト ファイル内で、Target 要素を使用して宣言します。 たとえば、次のコードでは、先ほどの例で宣言した項目のリストをパラメーターに指定して Csc タスクを呼び出す、Compile という名前のターゲットを作成しています。

<Target Name="Compile">
    <Csc Sources="@(Compile)" />
</Target>

ターゲットを使用して相互の関係を定義し、依存関係の分析を実行するなど、より高度なシナリオにも対応しています。これにより、ターゲットが最新のものである場合に、ビルド処理からセクション全体をスキップするようなことが可能となります。 ターゲットの詳細については、「MSBuild ターゲット」をご覧ください。

ビルド ログ

コンソールまたは別の出力デバイスにビルド エラー、警告、およびメッセージを記録できます。 詳細については、「MSBuild でのビルド ログの取得」を参照してください。

Visual Studio で MSBuild を使用する

Visual Studio では、マネージド プロジェクトに関するビルド情報を保存するために、MSBuild プロジェクト ファイル形式が使用されます。 Visual Studio インターフェイスを使ってプロジェクトの設定を追加または変更すると、プロジェクトごとに生成される .*proj ファイルに反映されます。 Visual Studio では、MSBuild のホスト インスタンスを使用して、マネージド プロジェクトがビルドされます。 つまり、マネージド プロジェクトは、Visual Studio でも、コマンド プロンプトでも (Visual Studio がインストールされていない場合でも) ビルドすることができ、結果は同じになります。

Visual Studio で MSBuild を使用する方法のチュートリアルについては、チュートリアル: MSBuild の使用に関するページを参照してください。

マルチ ターゲット

Visual Studio を使用すると、いくつかのバージョンの .NET Framework または .NET Core のうち、任意のバージョン (.NET 5 以降など) で動作するようにアプリケーションをコンパイルできます。 たとえば、あるアプリケーションを 32 ビット プラットフォーム上の .NET Framework 4 で動作するようにコンパイルすることや、これと同じアプリケーションを 64 ビット プラットフォーム上の .NET Framework 4.8 で動作するようにコンパイルすることができます。 複数のフレームワークに対してコンパイルする機能をマルチ ターゲットといいます。

マルチ ターゲットには、次のような利点があります。

  • バージョン 3.5、4.7.2 などの以前のバージョンの .NET Framework を対象とするアプリケーションを開発できます。

  • ターゲット フレームワークの定義済みのサブセットであるフレームワーク プロファイルを対象にできます。

  • 現在のバージョンの .NET Framework 用サービス パックがリリースされた場合、そのバージョンを対象にできます。

  • 複数バージョン対応により、アプリケーションが、対象となるフレームワークやプラットフォームのみで利用できる機能を使うことができます。

詳細については、MSBuild のマルチ ターゲットに関する記事をご覧ください。

ビルドのカスタマイズ

MSBuild では、さまざまなカスタム ビルド シナリオがサポートされています。 ほとんどの組み込み機能は、オーバーライドまたは拡張できます。 「ビルドのカスタマイズ」を参照してください。

プログラムによる MSBuild へのアクセス

ビルド ツールを開発している場合は、.NET アプリケーションからプログラムで MSBuild を呼び出すことができます。 MSBuild API を使用すると、複雑なビルド システムのすべての側面を制御できます。 MSBuild には、これらの目的で .NET アプリケーションから使用できる完全な API (Microsoft.Build 名前空間) を備えた NuGet パッケージが用意されています。 「MSBuild API を使用する」を参照してください。

MSBuild はオープンソース

MSBuild は、他の .NET エコシステムと同様に、ユーザー コントリビューションを受け入れるオープンソース プロジェクトです。 MSBuild ソースを含むリポジトリは、GitHub: MSBuild GitHub リポジトリで入手できます。

関連項目

Title 説明
チュートリアル: MSBuild プロジェクト ファイルのゼロからの作成 テキスト エディターのみを使用して、基本的なプロジェクト ファイルをインクリメント方式で作成する方法について説明します。
チュートリアル: MSBuild の使用 MSBuild のビルド ブロックについて説明し、Visual Studio IDE を閉じずに MSBuild プロジェクトを記述、操作、およびデバッグする方法について説明します。
MSBuild の概念 MSBuild の 4 つのビルド ブロックであるプロパティ、項目、ターゲット、およびタスクについて説明します。
項目 MSBuild ファイル形式の一般的な概念と、各構成要素の組み合わせ方について説明します。
MSBuild プロパティ プロパティとプロパティ コレクションについて説明します。 プロパティはビルドを設定するためのキーと値のペアです。
ターゲット タスクを特定の順序でグループ化し、コマンド ラインからビルド処理のセクションを呼び出すことができるようにする方法について説明します。
タスク 分割不可能なビルド操作を実行するために MSBuild で使用される、実行可能コードの単位を作成する方法について説明します。
条件 MSBuild の要素で Condition 属性を使用する方法について説明します。
バッチ処理 タスクとターゲットで実行するために、MSBuild で項目リストがメタデータ別に分類される方法を説明しています。
マルチ ターゲット 複数の .NET バージョンや複数のプラットフォームをターゲットにする方法を示しています。
[ビルド ログの取得](../msbuild/obtaining-build-logs-with-msbuild.md) ビルド イベント、メッセージ、およびエラーを記録する方法について説明します。
MSBuild によってプロジェクトがビルドされる方法 MSBuild 内で使用される内部ビルド プロセスについて説明します
コード生成用のカスタム タスクを作成する コード例を使って、カスタム タスクを作成する方法を示します。
MSBuild を使って REST API クライアントを生成する ビルドを拡張して REST API クライアントの生成を処理する方法を、コード例を使って示します。
その他のリソース MSBuild に関する詳細な情報を提供するコミュニティやサポートのリソースを紹介します。

関連項目

  • MSBuild リファレンス
    リファレンス情報を示すトピックへのリンクを提供します。

  • 用語集
    MSBuild で共通に使用される用語を定義します。