Visual Studio生成后事件-如果文件位于子文件夹中,如何将文件复制到输出(bin)目录(仅适用于更新的目录)

时间:2018-11-23 16:10:49

标签: visual-studio

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

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

但是,仅当二进制文件保留在主项目文件夹中时,此方法才有效。如果整理一下,然后将这些文件放在一个子文件夹中以与源文件区分开,则该子文件夹将在目标目录1:1中创建,而资源文件不在目标根目录中。

相关问题: VS PostBuild Event - Copy file if it exists

1 个答案:

答案 0 :(得分:1)

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

鉴于您要将所有文件复制到VS项目的子文件夹“ RuntimeEnv”中:

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

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

复制没有提供足够的功能。在下文中,我提到了xcopy和robocopy的解决方案

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

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

robocopy的两个特长在这里解决:

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

  2. 最后一行是必需的,因为robocopy会以返回码退出     包含复制的文件数,因此“ 0”与     按预期成功。

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

HTH。

P.S。正如Hans Passant在评论中指出的那样,xcopy /D是一个更简单的解决方案。 它是-并且如果robocopy的其他属性或参数都没有用,则可能更可取。

这将使行如下:

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

xcopy的输出行不会正常打扰,并提示构建后的情况-否则您也可以添加>nul 2>&1