Visual Studio 构建后事件 - 如果文件位于子文件夹中,如何将文件复制到输出 (bin) 目录(仅当较新时)

2023-12-06

如何将所需的二进制文件(例如dll、图标、工具、doc)复制到bin文件夹中的目标目录中?

有一个明显的集成可能性:包括与源文件一起完成的文件,并在“复制到输出目录”中的文件属性中标记为“始终复制”或“复制较新的”。

但这仅适用于二进制文件包含在主项目文件夹中的情况。如果您进行整理,并将这些文件放入子文件夹中只是为了与源文件区分开,则该子文件夹将在目标目录 1:1 中创建,并且资源文件不在根目标目录中。

相关问题:VS PostBuild 事件 - 复制文件(如果存在)


回答我自己的问题来分享我的知识。

假设您想要复制 VS 项目子文件夹“RuntimeEnv”中的所有文件:

在任何项目文件的构建属性下,都有一个“构建事件”选项卡,其中包含预构建和构建后命令行可能性,可以包含此类副本或类似的构建要求,而无需设置 TFS 构建定义。

在那里您可以包含类似批处理的命令并可以访问一些预构建变量。例如,请参阅问题中的链接。

副本没有提供足够的功能。下面我提到xcopy和robocopy的解决方案

由于我更喜欢​​ robocopy.exe,因为它非常快速、可靠并且是仅复制较新文件 (/XO) 的内置选项,因此我使用以下命令而不是简单的“复制”命令:

robocopy.exe /XO "$(ProjectDir)RuntimeEnv" "$(TargetDir)." >nul 2>&1
exit 0

这里有两个 robocopy 的特点:

  1. 这 ”。”在“$(TargetDir)”之后是必需的,因为 robocopy 不喜欢以反斜杠结尾的路径,这里就是这种情况。

  2. 最后一行是必要的,因为 robocopy 退出时带有返回码 包含复制的文件数,因此“0”与 正如预期的那样成功。

可以添加一些 MSBuild 目标行来更改预期的返回代码,但在 Post-Build 事件中执行此操作是最简单的。

HTH.

附:正如汉斯·帕桑特(Hans Passant)在评论中指出的那样,xcopy /D是一个更简单的解决方案。 是的,如果 robocopy 没有其他属性或参数有用,那么这可能是首选。

这将使该行:

xcopy.exe /D /Y "$(ProjectDir)RuntimeEnv\*.*" "$(TargetDir)"

xcopy 的输出行通常不会干扰,并提示构建后发生的情况 - 否则您可以添加>nul 2>&1 too.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio 构建后事件 - 如果文件位于子文件夹中,如何将文件复制到输出 (bin) 目录(仅当较新时) 的相关文章

随机推荐