删除文件后,Msbuild仍然在Include = * .cs中引用旧文件

时间:2013-09-12 08:50:01

标签: msbuild

我有一个问题,即ItemGroup没有更新,因此试图复制不再存在的文件,这会引发错误:

  <ItemGroup>
    <Others Include=".\Folder\**\*" />
  </ItemGroup>

现在当我删除Folder中的文件时,它仍然会尝试复制它,Visual Studio仍然会在文件列表中显示它。 如果某些文件发生变化或者更好的话,Visual Studio强制重新加载项目是有意义的:静默更新。

2 个答案:

答案 0 :(得分:0)

如果我说得对:

<ItemGroup>
    <Others Include=".\Folder\**\*" />
</ItemGroup>
<RemoveFile ... >
<CopyFile...> <!-- throws an error -->

解决方案:

<ItemGroup>
    <Others Include=".\Folder\**\*" />
</ItemGroup>
<RemoveFile ... >
<ItemGroup> <!-- refresh Others collection -->
    <Others Include=".\Folder\**\*" />
</ItemGroup>
<CopyFile...> <!-- should be ok now -->

答案 1 :(得分:0)

这是msbuild的工作原理。它不会无理由地重新评估ItemGroup,并且所有全局范围的评估都将在任何目标运行之前发生。当目标执行时,将评估目标范围的项目。

您可以在复制前使用简单的条件检查 - 例如条件='存在(...)'在您的itemgroup元素上。或者,如果它在您的控制中 - 使用其他名称重新创建项目组,并仅包括当前退出的项目。两种方式都是简单而有效的方案。 如果您要添加有关您的脚本的更多详细信息或您想要实现的目标 - 这将有助于我们为您提供更具体的答案。