我遇到的问题是 ItemGroup 没有更新,因此尝试复制不再存在的文件,这会引发错误:
<ItemGroup>
<Others Include=".\Folder\**\*" />
</ItemGroup>
现在,当我删除 中的文件时Folder
,它仍会尝试复制它,Visual Studio 仍会在文件列表中显示它。如果某些文件发生更改,或者更好的是:静默更新,Visual Studio 会强制重新加载项目是有道理的。
我遇到的问题是 ItemGroup 没有更新,因此尝试复制不再存在的文件,这会引发错误:
<ItemGroup>
<Others Include=".\Folder\**\*" />
</ItemGroup>
现在,当我删除 中的文件时Folder
,它仍会尝试复制它,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,并且所有全局范围的评估都将在任何目标运行之前发生。目标范围内的项目将在目标执行时进行评估。
您可以在复制之前使用简单的条件检查 - 例如Condition='Exists(...)'在您的 itemgroup 元素上。或者,如果它在您的控制范围内 - 使用另一个名称重新创建 itemgroup 并仅包含当前退出的项目。两种方式都是简单有效的场景。如果您要添加有关您的脚本或您想要实现的目标的更多详细信息 - 这将有助于我们为您提供更具体的答案。