我的客户解决方案中的一些项目有一个构建后事件:xcopy
构建输出到特定文件夹。这在本地构建时效果很好。但是,在 TeamCity 中,我偶尔会得到
xcopy [...] 以代码 2 退出
如果我使用常规copy
,它会以代码 1 退出。我希望这与文件锁定有关,尽管被复制的特定文件不一样,所以可能只是锁定共享目标目录。我习惯/y
不提示覆盖文件。
为什么这在 TeamCity 中失败了,但在本地却没有?
即使您为/Y
开关提供了 xcopy,当 xcopy 不知道您正在复制的内容是文件还是目录时,您仍然会收到错误消息。此错误将显示为“以代码 2 退出”。当您在命令提示符下运行相同的 xcopy 时,您会看到 xcopy 正在请求文件或目录的响应。
要通过自动构建解决此问题,您可以使用管道在预定义的响应中回显。
要说您正在复制的东西是一个文件,请回显F
:
echo F|xcopy /y ...
要说您正在复制的东西是一个目录,请回显D
:
echo D|xcopy /y ...
有时可以通过简单地使用复制命令而不是 xcopy 来解决上述问题:
copy /y ...
但是,如果通向最终文件目的地的目录不存在,则会出现“以代码 1 退出”。
请记住:/C
谨慎使用 switch 和 xcopy。
我通过在路径末尾添加 \ 来修复错误代码 2,没有它,xcopy 会认为它是文件而不是文件夹。
如果您在构建后事件中使用 xcopy,则除了 /C 之外,还要使用 /Y 开关。
/C Continues copying even if errors occur.
/Y Suppresses prompting to confirm you want to overwrite an existing file.
可能您将 TeamCity 与 git 一起使用。如果是,请检查您要复制的文件夹是否存在于 git 存储库中。通常 git aviod 将空项目文件夹添加到存储库,因此xcopy
找不到它并生成错误。
您可以将一些空文本文件添加到空文件夹,提交并查看文件夹出现在存储库中。
我对这个问题的解决方法是进入目标 bin 文件夹,并确保那里存在正确的子文件夹。手动创建该子文件夹后,构建过程成功完成。
copy
为我修好了。xcopy with /c /y
不工作。我得到一个出口 4 所以我去了xcopy
,但结果我需要引号($TargetPath)
。
我的脚本:
if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"