プロジェクト参照を含むソリューションのビルド時に、変更のないプロジェクトに対してもリビルドが行われる

こんにちは、Visual Studio サポート チームです。

今回は、Visual Studio でソリューションをビルドする際のリビルドの動作に関して、ご留意いただきたい内容をご紹介します。

 

現象

プロジェクト参照 (*1) を含むソリューションを Visual Studio で開き、ソリューション構成 (Debug/Release など) を切り替えてビルドを行うと、プロジェクトに変更が加えられていなくてもプロジェクトがリビルドされる場合があります。

 

(*1) "プロジェクト参照" とは、あるプロジェクトから、同一のソリューションに含まれる別のプロジェクトを参照する参照方法であり、被参照側プロジェクトに変更があると、そのプロジェクトだけでなく参照側のプロジェクトもビルドが必要とみなされます。複数のプロジェクトを 1 つのソリューションで同時に開発する場合に便利な参照形式です。

これに対し、DLL を直接参照する "アセンブリ参照" は、サードパーティから提供されている DLL や、社内共通の共通ライブラリとして提供されている DLL など、対象のプロジェクトと被参照 DLL が別々に開発される場合に利用される参照方法です。

 

原因

本現象は Visual Studio の想定された動作に基づく制限事項です。

プロジェクト参照を含むソリューションでは、Visual Studio がビルドの要否を判断するロジックの制約から、直前にビルドされたソリューション構成から変更が生じた場合に、プロジェクトを参照している側のプロジェクトに対してリビルドが行われます。(*2)

なお、"直前にビルドされたソリューション構成" の情報は、Visual Studio の起動中は Visual Studio 内に記憶され、Visual Studio の終了後は .suo ファイル (*3) に保持されます。ここで、.suo ファイルが存在しない状態では、"直前にビルドされたソリューション構成" としては既定の設定 (Debug) が適用されるため、.suo ファイルが存在しない状態で Release 構成のビルドを行うと、常に、"直前にビルドされたソリューション構成から変更が生じた" 状態と判断されるため、プロジェクト参照しているプロジェクトに対してリビルドが行われます。

このため、特に、直前に Release 構成でビルドを行った状態を保持した .suo ファイルが存在しない状態で、Visual Studio のコマンドライン ツールである devenv.exe を利用して Release 構成でソリューションのビルドを行うと、毎回、リビルドが行われてしまうといった状況が起こりえます。

 

(*2) 本動作は Visual Studio 2017 より前のバージョンの Visual Studio で確認されています。Visual Studio 2017 では IDE 上からのビルドでは本動作は改善されています。

(*3) .suo ファイルは、Visual Studio の終了時に自動的に出力される隠しファイルで、ユーザーによる設定などの情報を保持しています。Visual Studio 2013 の場合は ***.v12.suo、Visual Studio 2015 の場合は拡張子のみで .suo といった形で、バージョンによってファイル名が異なります。

 

<実行例 : .suo ファイルなし>

devenv.exe で Release 構成を指定して 2 回続けてビルドを行っていますが、更新不要とならずにビルドが実行されています。

c:\temp\VS2013\ConsoleApplication1_vb2013>devenv.exe /Build "Release|Any CPU" ConsoleApplication1_vb2013.slnMicrosoft Visual Studio 2013 Version 12.0.40629.0。 Copyright (C) Microsoft Corp. All rights reserved.------ ビルド開始: プロジェクト:ConsoleApplication1_vb2013, 構成:Release Any CPU ------========== ビルド: 1 正常終了、0 失敗、1 更新不要、0 スキップ ==========c:\temp\VS2013\ConsoleApplication1_vb2013>devenv.exe /Build "Release|Any CPU" ConsoleApplication1_vb2013.slnMicrosoft Visual Studio 2013 Version 12.0.40629.0。 Copyright (C) Microsoft Corp. All rights reserved.------ ビルド開始: プロジェクト:ConsoleApplication1_vb2013, 構成:Release Any CPU ------========== ビルド: 1 正常終了、0 失敗、1 更新不要、0 スキップ ==========

 

対処策

対象のソリューションを、一度、Visual Studio で開いて Release 構成でビルドし、Visual Studio を終了して .suo ファイルが出力された状態とすることで、devenv.exe を使用して Release 構成でビルドを行う場合でも、不要なリビルドを避けることができます。

<実行例 : Release 構成でビルドして終了した際に出力された .suo ファイルあり>

c:\temp\VS2013\ConsoleApplication1_vb2013>devenv.exe /Build "Release|Any CPU" ConsoleApplication1_vb2013.slnMicrosoft Visual Studio 2013 Version 12.0.40629.0。 Copyright (C) Microsoft Corp. All rights reserved.========== ビルド: 0 正常終了、0 失敗、2 更新不要、0 スキップ ==========c:\temp\VS2013\ConsoleApplication1_vb2013>devenv.exe /Build "Release|Any CPU" ConsoleApplication1_vb2013.slnMicrosoft Visual Studio 2013 Version 12.0.40629.0。 Copyright (C) Microsoft Corp. All rights reserved.========== ビルド: 0 正常終了、0 失敗、2 更新不要、0 スキップ ==========

 

プロジェクトの規模が大きくできる限り不要なリビルドを避けたい場合など、上記内容がお役に立てましたら幸いです。