如何使用msbuild/web部署项目删除多个文件?

Ale*_*lex 11 msbuild web-deployment-project visual-studio-2008

我有一个奇怪的问题,msbuild如何使用VS2008 Web部署项目,并想知道为什么它似乎随机行为不端.

我需要从部署文件夹中删除一些应该只存在于我的开发环境中的文件.这些文件是在开发/测试期间由Web应用程序生成的,不包含在我的Visual Studio项目/解决方案中.

我使用的配置如下:

<!--  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>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我进行Web部署项目的构建/重建时,它"有时"会删除所有文件,但有时它不会删除任何内容!或者它将只删除DeleteAfterBuild项目组中三个文件夹中的一个或两个.在构建过程何时决定删除文件时,似乎没有一致性.

当我将配置编辑为仅包含文件夹1(例如)时,它会正确删除所有文件.然后添加文件夹2和3,它开始删除所有文件,如我所愿.然后,在随机时间看,我将重建项目,它不会删除任何文件!

我已经尝试将这些项目移动到ExcludeFromBuild项目组(可能它应该在哪里),但它给了我相同的不可预测的结果.

有没有人经历过这个?难道我做错了什么?为什么会这样?

Ale*_*lex 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>
Run Code Online (Sandbox Code Playgroud)

解释为什么删除过程产生"不可预测的"结果 -

  1. 从干净的构建输出路径开始
  2. 构建#1 - 构建Web部署项目.@(DeleteAfterBuild)将评估没有文件,因为文件$(OutputPath)夹中不存在文件,并且不会删除任何文件作为AfterBuild目标的一部分
  3. 构建#2 - 构建Web部署项目.@(DeleteAfterBuild)将评估文件$(OutputPath)夹中的所有预期文件,并将文件作为AfterBuild目标的一部分删除
  4. 基本上我们现在回到第2阶段.重复一遍.结果当然是可预测的 - 不再刮你的头.

参考资料:操作方法 :动态创建项目组, 延迟评估MSBUILD文件中的项目