gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:25:35 24 4
gpt4 key购买 nike

我对 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>

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

当我编辑配置以仅包含文件夹 1(例如)时,它会正确删除所有文件。然后添加文件夹 2 和 3,它开始根据需要删除所有文件。然后,似乎在随机时间,我将重建项目并且它不会删除任何文件!

我曾尝试将这些项目移动到 ExcludeFromBuild 项目组(这可能是它应该在的地方),但它给了我同样不可预测的结果。

有没有人经历过这个?难道我做错了什么?为什么会发生这种情况?

最佳答案

<ItemGroup>在脚本加载时和 <Target> 之前评估已处理。

似乎有不止一种方法可以正确地做到这一点 -

  • 包括 <ItemGroup>内部<Target>并且应该在正确的时间进行评估。这将适用于 MS-Build v3.5+
  • 使用 <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 - 构建 Web 部署项目。 @(DeleteAfterBuild)将评估没有文件,因为文件不存在于 $(OutputPath)文件夹,并且不会删除任何文件作为 AfterBuild 的一部分目标
  • 构建 #2 - 构建 Web 部署项目。 @(DeleteAfterBuild)将使用 $(OutputPath) 中的所有预期文件进行评估文件夹并将删除文件作为 AfterBuild 的一部分目标
  • 基本上我们现在回到第 2 阶段。重复。结果当然是可以预测的 - 不再挠头。

  • 引用资料:
    How To: Create Item Groups on the Fly ,
    Delayed evaluation of items in MSBUILD file

    关于visual-studio-2008 - 如何使用 msbuild/web 部署项目删除多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/851647/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com