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

93

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

xcopy [...] завершился с кодом 2

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

Почему это не удается в TeamCity, но не локально?

Тим Айлс
источник
У меня были похожие проблемы, но связанные с одновременным копированием одного и того же файла параллельно. Не могли бы вы дважды проверить, что ни один файл не копируется дважды?
Игнасио Солер Гарсия,
4
Код выхода 2 означает The user pressed CTRL+C to terminate xcopy. Хе-хе.
Ханс Пассан,
@SoMoS Да, копируемые файлы определенно разные.
Тим Айлс
@HansPassant Я не знаю, почему teamcity захочет нажать на меня CTRL + C! :(
Тим Айлс
5
Да, я тоже. Другое распространенное соглашение заключается в том, что код выхода равен последней ошибке или исключению Windows. Ошибка 2 означает «файл не найден». Что, конечно, имеет больше смысла.
Ханс Пассан,

Ответы:

147

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

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

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

echo F|xcopy /y ...

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

echo D|xcopy /y ...

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

copy /y ...

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

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

Метро Смурф
источник
Спасибо @Metro Smurf. Я не могу проверить, помогло бы это решить мою проблему, но то, что вы говорите, звучит умно, поэтому я отметил это как ответ. Ура!
Тим Айлс
Я столкнулся с той же проблемой и, в конечном итоге, получил ответ в виде конвейера. Надеюсь, это поможет кому-то другому в долгосрочной перспективе.
Metro Smurf
1
«Это не работает в локализованных версиях Windows, где слова подсказки могут быть другими. Альтернативный трюк - добавить звездочку» в конец места назначения, тогда xcopy не будет запрашивать файл / каталог. - Говерт Ян 28 в 19:40 "Итак, вы можете сделать копию, как это, без echo D (что ненадежно): XCOPY $ (ProjectDir) .. \ scripts * $ (TargetDir) scripts * / Y / R. Или сделайте копию без эха F: XCOPY D: \ file.zip c: \ renamedFile.zip / Y / R
leetNightshade
@leetNightshade - будет ли *работа с каталогами? Или это только для файлов?
Metro Smurf
@MetroSmurf Хм, похоже, форматирование моего примера не удалось, отсутствуют обратные косые черты (должно быть, я думал, что я пытался избежать символа) и отсутствовала звездочка. Но да, он работает с каталогами и файлами. Вот ссылка на ответ Говерта: stackoverflow.com/a/14022309/353094
leetNightshade
37

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

Томаш Беньо
источник
3
Вот и все. Отлично работал в Windows 7, Visual Studio 2013. Большое спасибо!
Чарльз
33

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

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.
DavidS
источник
4
Так просто! /Yподавляет подсказку! Почему это было так сложно найти?
SouthShoreAK
3
/ Y подавляет запрос на перезапись, но это не единственная причина появления кода 2. RTFM не скажет вам, что их вызывает.
MSalters
2

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

бумер57
источник
2

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

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

if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"
Мэтт
источник
2

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

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

Илия
источник