Visual Studio后生成事件 - 如何将文件复制到输出(bin)目录(仅在文件位于子文件夹中且更新时)

3
如何将所需的二进制文件(例如dlls、图标、工具、文档)复制到bin文件夹中的目标目录中?
有一个显而易见的集成方法:像源文件一样包含该文件,并在“复制到输出目录”文件属性中标记为“始终复制”或“较新的复制”。
但这仅适用于那些二进制文件留在主项目文件夹中的情况。如果你清理了项目,并将这些文件放在一个子文件夹中以便与源文件区分开来,那么这个子文件夹将会在目标目录中被1:1创建,而资源文件不会在根目录的目标目录中。
相关问题: VS后生成事件 - 如果存在则复制文件

1
xcopy /d 是基本的方式,/d 告诉它如果目标文件是最新的就不做任何事情。 - Hans Passant
你说得对。我不知道那个。Robocopy通常用于自动化任务,特别是处理大量跨网络的数据,并且有很多或至少其他选项-但在这种情况下,xcopy.exe可能更适合,因为您不必解决两个特殊问题。- Philm 12分钟前编辑 - Philm
...还需要一个额外的/Y。 - Philm
1个回答

9

在此分享我的知识并回答自己的问题。

如果你想复制VS项目子目录“RuntimeEnv”中的所有文件:

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

你可以在那里包含类似批量命令,并访问一些预构建变量。例如,查看问题中的链接。

copy 命令不能提供足够的功能。下面,我将介绍一个 xcopy 和 robocopy 的解决方案。

由于我更喜欢很快、可靠且内置了只复制更新文件(/XO)的选项的robocopy.exe,所以我使用以下命令而不是简单的“复制”命令:

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

这里有两个关于robocopy的特殊情况:
  1. 在"$(TargetDir)"后面加上"."是必要的,因为robocopy不喜欢以反斜杠结尾的路径,而这里就是这种情况。

  2. 最后一行是必要的,因为robocopy退出时会返回一个包含已复制文件数量的返回码,所以"0"并不像预期的那样表示成功。

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

希望对您有所帮助。

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

这将使该行变为:

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

xcopy的输出行通常不会干扰,而且会在后期构建时提示正在发生的情况 - 否则,您也可以添加>nul 2>&1

1
非常感谢您的QA。虽然exit 0可能不是理想的解决方案,因为复制命令可能会悄无声息地失败。更好的解决方案是使用类似于IF %ERRORLEVEL% LSS 8 (SET ERRORLEVEL = 0) ELSE (exit %ERRORLEVEL%)的方法返回适当的退出代码 - Marcos Dimitrio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接