为什么在 TeamCity 构建中构建后步骤 (xcopy) 偶尔会退出并显示代码 2?
我的客户解决方案中的一些项目有一个构建后事件:将构建输出 xcopy 到特定文件夹。这在本地构建时效果很好。然而,在 TeamCity 中,我偶尔得到
xcopy [...] 退出,代码为 2
如果我使用常规 copy
,它会以代码 1 退出。我希望这与文件锁定有关,尽管正在复制的特定文件并不相同,所以也许只是锁定共享目标目录。我使用 /y
不提示覆盖文件。
为什么这在 TeamCity 中失败,但在本地却失败?
A few projects in my client's solution have a post-build event: xcopy
the build output to a specific folder. This works fine when building locally. However, in TeamCity, I occasionally get
xcopy [...] exited with code 2
If I use regular copy
, it exits with code 1. I expect this has something to do with file locks, although the specific files being copied are not the same, so perhaps just locking on the shared destination directory. I use /y
to not prompt on overwriting files.
Why this fails in TeamCity but not locally?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我对此问题的解决方法是进入目标 bin 文件夹,并确保那里存在正确的子文件夹。手动创建该子文件夹后,构建过程成功完成。
My fix for this issue was to go into the target bin folder, and ensure that the proper subfolder exists there. Once that subfolder was manually created, the build process completed successfully.
copy
为我修复了它。xcopy 与 /c /y
不起作用。我当时正处于出口 4,所以我选择了xcopy
,但结果发现我需要在($TargetPath)
周围加上引号。我的脚本:
copy
fixed it for me.xcopy with /c /y
did not work. I was getting an exit 4 so I went withxcopy
, but turned out I needed quotes around($TargetPath)
.My script:
可能您将 TeamCity 与 git 一起使用。如果是,请检查 git 存储库中是否存在要复制的文件夹。通常 git aviod 会向存储库添加空项目文件夹,因此 xcopy 无法找到它并生成错误。
您可以将一些空文本文件添加到空文件夹中,提交并查看文件夹出现在存储库中。
Probably you using TeamCity with git. If yes, check that folders you want to copy are exists in git repository. Usually git aviod adding empty project folders to repository, so
xcopy
fails to find it and generates a error.You can add some empty text file to empty folder, commit and see folder appears in repository.
即使您为 xcopy 提供了
/Y
开关,当 xcopy 不知道您要复制的内容是文件还是目录时,您仍然会收到错误消息。此错误将显示为“退出代码 2”。当您在命令提示符下运行相同的 xcopy 时,您将看到 xcopy 正在请求文件或目录的响应。要通过自动构建解决此问题,您可以使用管道回显预定义的响应。
说你复制的东西是文件, echo in
F
:说你复制的东西是目录, echo in
D
:有时候上面可以解决通过简单地使用复制命令而不是 xcopy:
但是,如果通向最终文件目标的目录不存在,则会出现“以代码 1 退出”的情况。
请记住:请谨慎使用
/C
开关和 xcopy。Even if you provide the
/Y
switch with xcopy, you'll still get an error when xcopy doesn't know if the thing you are copying is a file or a directory. This error will appear as "exited with code 2". When you run the same xcopy at a command prompt, you'll see that xcopy is asking for a response of file or directory.To resolve this issue with an automated build, you can echo in a pre-defined response with a pipe.
To say the thing you are copying is a file, echo in
F
:To say the thing you are copying is a directory, echo in
D
:Sometimes the above can be resolved by simply using a copy command instead of xcopy:
However, if there are non-existent directories leading up to the final file destination, then an "exited with code 1" will occur.
Remember: use the
/C
switch and xcopy with caution.我通过在路径末尾添加 \ 来修复错误代码 2,如果没有它,xcopy 会认为它是一个文件而不是文件夹。
I fixed the error code 2 by adding a \ at the end of my path, without it, xcopy will think that it is a file instead of a folder.
如果您在构建后事件中使用 xcopy,除了 /C 之外,还可以使用 /Y 开关。
If you are using xcopy in a post build event use the /Y switch in addition to the /C.