5

これは、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 回目は成功する場合がありますが、複数回実行すると失敗します)。

4

4 に答える 4

5

MSBuildExtensionPathCMDプロンプトで環境変数を設定してから、ビルドを実行してみましたか?

例えば:

C:\> SET MSBuildExtensionsPath=C:\My\MSBuild\Extensons

次に、このプロジェクトファイルで:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build">
    <Message Text='MSBuildExtensionsPath="$(MSBuildExtensionsPath)"' />
  </Target>
</Project>

次の出力が得られます。

c:\Users\chuckeng\Desktop\ConsoleApplication1>"C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" my.proj
Microsoft (R) Build Engine Version 3.5.30729.4926
[Microsoft .NET Framework, Version 2.0.50727.4927]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 6/25/2010 1:04:05 PM.
Project "c:\my.proj" on node 0 (default targets).
  MSBuildExtensionsPath="C:\My\MSBuild\Extensons"
Done Building Project "c:\my.proj" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.03

これはv4.0からも機能します。ただし、v4.0では、このようなサポートの方が一般的に優れています。また、v4.0は100%下位互換性があります(バグは耐えられません)。したがって、v3.5以前のプロジェクトをv4.0でビルドできます。ToolsVersion3.5を選択するだけです。

msbuild my.proj /tv:3.5

お役に立てれば...

Chuck EnglandVisualStudioプログラムマネージャー-MSBuild

于 2010-06-25T20:10:06.417 に答える
3

これは MSBuild 3.5 のバグですが、MSBuild 4 で修正されています。

可能であれば、MSBuild 4 に切り替えます (3.5 プロジェクトをコンパイルすることはできます)。それ以外の場合は、プロジェクト ファイルのプロパティをオーバーライドする必要があります。

于 2010-05-22T08:41:34.457 に答える
3

Web アプリファイルMSBuildExtensionsPathで直接オーバーライドすると、問題なく動作します。.csproj

<PropertyGroup>
  <MSBuildExtensionsPath>C:\Users\madgnome\Desktop\msbuild</MSBuildExtensionsPath>

  <!-- It works too with relative path -->
  <!--<MSBuildExtensionsPath>..\msbuild</MSBuildExtensionsPath>-->
</PropertyGroup>

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
于 2010-05-20T19:18:42.207 に答える
1

これが将来誰かに役立つかどうかはわかりませんが、ファイルの先頭で次を使用でき、32 ビットと 64 ビットの両方のビルド環境で期待どおりに動作します。

<PropertyGroup>
  <MSBuildExtensionsPath Condition=" '$(MSBuildExtensionsPath64)' != '' ">$(MSBuildExtensionsPath64)</MSBuildExtensionsPath>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks"/>
于 2013-01-17T18:33:18.030 に答える