Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 如何使用msbuild/web部署项目删除多个文件?_Visual Studio 2008_Msbuild_Web Deployment Project - Fatal编程技术网

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

Visual studio 2008 如何使用msbuild/web部署项目删除多个文件?,visual-studio-2008,msbuild,web-deployment-project,Visual Studio 2008,Msbuild,Web Deployment Project,我对msbuild在VS2008 Web部署项目中的行为有一个奇怪的问题,我想知道为什么它看起来是随机的错误行为 我需要从部署文件夹中删除一些只应存在于我的开发环境中的文件。这些文件是在开发/测试期间由web应用程序生成的,不包括在我的Visual Studio项目/解决方案中 我使用的配置如下所示: <!-- Partial extract from Microsoft Visual Studio 2008 Web Deployment Project --> <ItemG

我对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项目组(这可能是它应该所在的位置),但它给了我同样不可预测的结果


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

查看我刚刚发布的博客,我想它可能会对你有所帮助。如果没有,请告诉我

Sayed Ibrahim Hashimi

在加载脚本时以及处理
之前对
进行评估

要正确地做到这一点,似乎有多种方法-

  • 包含在
    中,并应在正确的时间对其进行评估。这将适用于MS Build v3.5+

  • 使用
    生成项目列表

  • 此示例的构建脚本-

    <!-- 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
    目标的一部分删除这些文件
  • 基本上我们现在回到了第二阶段。重复一遍。结果当然是可以预测的——不再抓你的头了
  • 参考资料: ,

    我意识到这个问题已经得到了回答,但我想我会加上我的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>
    

    +1-我的头也被刮伤了。这是一个完美的答案。谢谢