これは、MS Connect で既に相互投稿されています。
https://connect.microsoft.com/VisualStudio/feedback/details/560451
msbuild を使用して C# Web アプリケーション プロジェクトを含むソリューションをビルドするときに、プロパティ $(MSBuildExtensionsPath) をオーバーライドしようとしています。これは、Web アプリケーションの csproj ファイルが "$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" というファイルをインポートするためです。このファイルは、Visual Studio によって標準の $(MSBuildExtensionsPath) の場所 (C:\Program Files\MSBuild) にインストールされます。このファイルがマシンにインストールされていることへの依存を排除したいと考えています (ビルド サーバーをできるだけ「クリーン」に保ちたいと考えています)。これを行うには、プロジェクトのソース管理に Microsoft.WebApplication.targets を含め、$(MSBuildExtensionsPath) をオーバーライドして、csproj がこの含まれているバージョンの Microsoft.WebApplication.targets をインポートするようにします。
このスキームは、コマンド ラインからソリューション ファイルをビルドし、コマンド ラインで $(MSBuildExtensionsPath) のカスタム値を /p フラグを介して msbuild に指定すると、正常に機能します。ただし、カスタム msbuild プロジェクト ファイルで MSBuild タスクを使用してソリューションをビルドしようとすると ("Properties" 属性を使用して MSBuildExtensionsPath をオーバーライドします)、Web アプリの csproj ファイルが Microsoft.WebApplication.targets を"標準" Microsoft.WebApplication.targets の場所 (C:\Program Files\MSBuild)。特に、カスタム プロジェクト ファイルで "Exec" タスクを使用して msbuild を実行すると、機能します。さらに注目すべきは、「EXEC」タスクを使用して (またはコマンド ラインから直接) ビルドを実行した後、「MSBuild」タスクを使用してビルドを初めて実行すると、ビルドが機能することです。
誰もこのような行動を見たことがありますか? 私はクレイジーですか?この問題の根本的な原因、考えられる回避策、またはこれが MSBuild の正当なバグであるかどうかを知っている人はいますか?
再現する手順:
1) MSVS 2008 (Fake.sln) で新しい空のソリューションを作成します。
2) 新しい C# Web アプリケーションをソリューション (WebApplication1.csproj) に追加します。
3) MSVS を閉じる
4) "C:\Program Files\MSBuild\" の内容を、ソリューションを含むディレクトリ内の "MSBuildExtensions" というディレクトリにコピーします。
5) WebApplication1.csproj がその場所から Microsoft.WebApplication.targets をインポートできないように、ディレクトリの名前を "C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\WebApplications" に変更します。
6) ソリューションと同じディレクトリに "TestBuild.proj" という名前のカスタム MSBuild プロジェクト ファイルを作成します。次の内容が含まれている必要があります。
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="BuildMSBuild">
<PropertyGroup>
<MSBuildExtensionsPath>$(MSBuildProjectDirectory)\MSBuildExtensions\</MSBuildExtensionsPath>
<BuildThis>Fake.sln</BuildThis>
</PropertyGroup>
<Target Name="BuildMSBuild">
<MSBuild Projects="$(BuildThis)" Properties="MSBuildExtensionsPath=$(MSBuildExtensionsPath);" Targets="Clean" />
<MSBuild Projects="$(BuildThis)" Properties="MSBuildExtensionsPath=$(MSBuildExtensionsPath);"/>
</Target>
</Project>
7) MSVS コマンド プロンプトから「msbuild TestBuild.proj」を実行します (注: ビルドは 1 回目は成功する場合がありますが、複数回実行すると失敗します)。