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

删除文件后,Msbuild仍在引用Include=*.cs中的旧文件,msbuild,Msbuild,我的问题是,项目组没有更新,因此尝试复制不再存在的文件,这会引发错误: <ItemGroup> <Others Include=".\Folder\**\*" /> </ItemGroup> 现在,当我删除文件夹中的文件时,它仍会尝试复制该文件,而Visual Studio仍会在文件列表中显示该文件。 如果某些文件发生更改,Visual Studio将强制重新加载项目,或者更好的做法是:以静默方式进行更新。如果我得到的文件正确: <

我的问题是,项目组没有更新,因此尝试复制不再存在的文件,这会引发错误:

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

现在,当我删除
文件夹
中的文件时,它仍会尝试复制该文件,而Visual Studio仍会在文件列表中显示该文件。 如果某些文件发生更改,Visual Studio将强制重新加载项目,或者更好的做法是:以静默方式进行更新。

如果我得到的文件正确:

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

msbuild就是这样工作的。它不会无缘无故地重新评估ItemGroup,所有全局范围的评估都将在任何目标运行之前进行。目标范围内的项将在执行目标时进行评估

在复制itemgroup元素之前,可以使用简单的条件检查,如condition='Exists(…)'。或者,如果它在您的控件中,请使用另一个名称重新创建itemgroup,并仅包括当前存在的项。这两种方法都是简单有效的场景。
如果您要添加有关脚本或您试图实现的目标的更多详细信息,这将有助于我们为您提供更具体的答案。

我对我的问题描述得很糟糕:文件的删除和复制发生在msbuild之外。用户复制或删除文件,并且我的msbuild脚本应该在项目组中保留更新的列表。尝试从VS中的文件夹中排除所有文件。如果要查看VS中的这些文件,请单击“在解决方案资源管理器中显示所有文件”。通过这种方式,您将更新文件夹中的文件列表,并且您的脚本不应被破坏(如果您在任何文件夹文件操作之前更新了其他集合),因此,您的刷新实际上应该在ItemGroup中创建重复的条目