Почему шаг после сборки (xcopy) иногда завершается с кодом 2 в сборке TeamCity? - PullRequest
86 голосов
/ 20 октября 2011

Несколько проектов в решении моего клиента имеют событие после сборки: xcopy вывод сборки в определенную папку.Это прекрасно работает при локальном строительстве.Тем не менее, в TeamCity я иногда получаю

xcopy [...] с кодом 2

Если я использую обычный copy,он завершается с кодом 1. Я ожидаю, что это как-то связано с блокировками файлов, хотя конкретные копируемые файлы не совпадают, так что, возможно, просто блокировка в общем каталоге назначения.Я использую /y, чтобы не запрашивать перезапись файлов.

Почему это происходит в TeamCity, а не локально?

Ответы [ 6 ]

133 голосов
/ 01 февраля 2013

Даже если вы предоставите ключу /Y с xcopy, вы все равно получите ошибку, когда xcopy не будет знать, является ли копируемый файл файлом или каталогом. Эта ошибка будет отображаться как «выход с кодом 2». Когда вы запустите тот же xcopy из командной строки, вы увидите, что xcopy запрашивает ответ файла или каталога.

Чтобы решить эту проблему с помощью автоматической сборки, вы можете отобразить заранее определенный ответ с каналом.

Чтобы сказать, что вы копируете, это файл, эхо в F:

echo F|xcopy /y ...

Чтобы сказать, что вы копируете, это каталог, echo в D:

echo D|xcopy /y ...

Иногда вышеупомянутое можно решить, просто используя команду копирования вместо xcopy:

copy /y ...

Однако, если существуют несуществующие каталоги, ведущие к конечному месту назначения файла, то произойдет «выход с кодом 1».

Помните: используйте переключатель /C и xcopy с осторожностью.

31 голосов
/ 13 октября 2013

Я исправил код ошибки 2, добавив \ в конце моего пути, без него xcopy будет думать, что это файл, а не папка.

30 голосов
/ 12 марта 2012

Если вы используете xcopy в событии после сборки, используйте переключатель / Y в дополнение к / C.

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.
2 голосов
/ 26 апреля 2013

Мое исправление для этой проблемы состояло в том, чтобы перейти в папку целевого бина и убедиться, что там есть соответствующая подпапка Как только эта подпапка была создана вручную, процесс сборки успешно завершен.

1 голос
/ 24 июля 2018

copy исправил это для меня. xcopy with /c /y не работает. Я получил выход 4, поэтому я пошел с xcopy, но оказалось, что мне нужны кавычки около ($TargetPath).

Мой сценарий:

if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"
1 голос
/ 30 декабря 2014

Возможно, вы используете TeamCity с git. Если да, проверьте, что папки , которые вы хотите скопировать, существуют в репозитории git. Обычно git aviod добавляет пустые папки проекта в репозиторий, поэтому xcopy не может его найти и выдает ошибку.

Вы можете добавить некоторый пустой текстовый файл в пустую папку, зафиксировать и увидеть, что папка появляется в хранилище.

...