【问题标题】:MSBuild Fails to remove Binaries directoryMSBuild 无法删除 Binaries 目录
【发布时间】:2011-03-25 07:55:30
【问题描述】:

我正在使用 MSBuild 构建两个解决方案:

<ItemGroup> 
    <SolutionToBuild Include="$(BuildProjectFolderPath)/HostASPX/SolutionA.sln"/>    
    <SolutionToBuild Include="$(BuildProjectFolderPath)/../Installer/SolutionB.sln"/>     
  </ItemGroup>  

似乎此构建失败并显示错误消息:

无法删除目录“c:\TeamBuild\Team Solutions\Solution\Binaries”。目录不为空。

MSBuild 似乎默认创建了这个“二进制”目录,并且构建通过了。当我再次构建时,构建失败并显示上述消息。如果我尝试第三次构建..它会再次工作。

谁能告诉我如何确保他的文件夹每次都被删除/覆盖?

【问题讨论】:

    标签: tfs build msbuild build-process


    【解决方案1】:

    你确定没有observer effect 在玩吗?即,某些东西没有像 explorer.exe 那样锁定目录:P

    您可以使用\\live.sysinternals.com\procmon.exe(找出谁在对目录做了什么)和procexp(找出谁在锁定它)来排除它。

    【讨论】:

    • @Nick 我也遇到了同样的问题,到底是什么原因造成的
    • @Ruben Bartelink ,你的意思是观察者效应? en.wikipedia.org/wiki/Observer_effect_(physics)
    • @juFo 是的,使用我不明白的词是什么词:)已修复。
    • @RubenBartelink 我也不懂,但维基百科告诉我这是错误的;-p
    【解决方案2】:

    我在运行一个看起来像这样的目标时遇到了“无法删除目录...目录不为空”的相同问题:

     <Target Name="CleanFiles"
        DependsOnTargets="Prepare_Files"
        Inputs="@(Files->'%(OutputPath)'->Distinct())"
        Outputs="_Non_Existent_Item_To_Batch_">
    
        <ItemGroup>
          <DirsToDelete Include="@(Files->'%(OutputPath)'->Distinct())"/>      
        </ItemGroup>
    
        <RemoveDir Directories="@(DirsToDelete)"/>
    
      </Target>
    

    有时它运行良好并删除了目录,但我经常收到上述错误。

    最终我发现 MSBuild 本身正在锁定文件,因为它们出现在目标的“输入”上,并且没有及时解锁它们以便 RemoveDir 删除它们。
    将上述更改为:

     <Target Name="CleanFiles"
        DependsOnTargets="Prepare_Files">
    
        <ItemGroup>
          <DirsToDelete Include="@(Files->'%(OutputPath)'->Distinct())"/>      
        </ItemGroup>
    
        <RemoveDir Directories="@(DirsToDelete)"/>
    
      </Target>
    

    似乎解决了这个问题。

    总是删除所有目录还是可以的,因为 RemoveDir 会跳过不存在的目录,不会报错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多