11

msbuildがVS2008Web配置プロジェクトでどのように動作するかについて奇妙な問題があり、ランダムに誤動作しているように見える理由を知りたいです。

開発環境にのみ存在するはずのいくつかのファイルをデプロイメントフォルダーから削除する必要があります。ファイルは開発/テスト中にWebアプリケーションによって生成されたものであり、VisualStudioプロジェクト/ソリューションには含まれていません。

私が使用している構成は次のとおりです。

<!--  Partial extract from Microsoft Visual Studio 2008 Web Deployment Project -->
<ItemGroup>
  <DeleteAfterBuild Include="$(OutputPath)data\errors\*.xml" /> <!-- Folder 1: 36 files -->
  <DeleteAfterBuild Include="$(OutputPath)data\logos\*.*" />    <!-- Folder 2: 2 files -->
  <DeleteAfterBuild Include="$(OutputPath)banners\*.*" />       <!-- Folder 3: 1 file -->
</ItemGroup>

<Target Name="AfterBuild">
  <Message Text="------ AfterBuild process starting ------" Importance="high" />
    <Delete Files="@(DeleteAfterBuild)">
      <Output TaskParameter="DeletedFiles" PropertyName="deleted" />
    </Delete>
    <Message Text="DELETED FILES: $(deleted)" Importance="high" />
  <Message Text="------ AfterBuild process complete ------" Importance="high" />
</Target>

私が抱えている問題は、Web配置プロジェクトのビルド/再構築を行うと、「時々」すべてのファイルが削除されますが、それ以外の場合は何も削除されないことです。または、DeleteAfterBuildアイテムグループ内の3つのフォルダーのうち1つまたは2つだけを削除します。ビルドプロセスがファイルを削除するかどうかを決定するとき、一貫性がないようです。

たとえば、フォルダ1のみを含むように構成を編集すると、すべてのファイルが正しく削除されます。次に、フォルダ2と3を追加すると、必要に応じてすべてのファイルが削除され始めます。次に、ランダムに見えるように、プロジェクトを再構築しますが、ファイルは削除されません。

これらのアイテムをExcludeFromBuildアイテムグループ(おそらく本来あるべき場所)に移動しようとしましたが、同じ予測できない結果が得られます。

誰かがこれを経験しましたか?私は何か間違ったことをしていますか?なぜこれが起こるのですか?

4

2 に答える 2

29

<ItemGroup>、スクリプトのロード時および<Target>が処理される前に評価されます。

これを正しく行う方法は複数あるようです -

  1. <ItemGroup>の内部を含めて<Target>、正しいタイミングで評価する必要があります。これは MS-Build v3.5+ で動作します

  2. <CreateItem>アイテムリストの生成に使用

このためのビルドスクリプトの例 -

<!-- Using ItemGroup -->
<Target Name="AfterBuild">
  <ItemGroup>
    <DeleteAfterBuild Include="$(OutputPath)data\errors\*.xml" />
  </ItemGroup>
  <Delete Files="@(DeleteAfterBuild)" />
</Target>

<!-- Using CreateItem -->
<Target Name="AfterBuild">
  <CreateItem Include="$(OutputPath)data\errors\*.xml">
    <Output TaskParameter="Include" ItemName="DeleteAfterBuild"/>
  </CreateItem>
  <Delete Files="@(DeleteAfterBuild)" />
</Target>

削除プロセスが「予測できない」結果を生成していた理由を説明するには -

  1. クリーンなビルド出力パスから始める
  2. ビルド #1 - Web 配置プロジェクトをビルドします。@(DeleteAfterBuild)ファイルがフォルダーに存在しないため、ファイルなしで評価され、ターゲット$(OutputPath)の一部としてファイルは削除されませんAfterBuild
  3. ビルド #2 - Web 配置プロジェクトをビルドします。@(DeleteAfterBuild)フォルダー内の予想されるすべてのファイルで評価され、ターゲット$(OutputPath)の一部としてファイルが削除されますAfterBuild
  4. 基本的に、ステージ 2 に戻ります。繰り返します。もちろん、結果は予測可能です。もう頭を悩ませる必要はありません。

参考資料: How To: Create Item Groups on the Fly , Delayed Evaluation of items in MSBUILD file

于 2009-05-13T07:51:13.683 に答える
0

これはすでに回答されていることに気づきましたが、5セント追加すると思いました。Web 配置プロジェクトの場合、提供されたターゲットを使用する必要はありません。ExcludeFromBuild要素を含むアイテム グループを追加するだけです。参照用に、展開プロジェクト ファイルの下部から関連するセクションを提供しました。

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\WebDeployment\v9.0\Microsoft.WebDeployment.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.WebDeployment.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="BeforeMerge">
  </Target>
  <Target Name="AfterMerge">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
  <ItemGroup>
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\obj\**\*.*" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\Properties\**\*.*" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\**\*.csproj*" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\**\*.resx" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\**\*.Publish.xml" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\LocalTestRun.testrunconfig" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\TestResults\**\*.*" />
  </ItemGroup>
于 2010-03-18T21:59:26.310 に答える