Копирование команды завершено с кодом 4 при сборке - перезапуск Visual Studio решает ее - PullRequest
145 голосов
/ 05 октября 2010

Время от времени, когда я строю свое решение здесь (с 7 проектами в нем), я получаю страшную ошибку «Копия команды завершена с кодом 4», в Visual Studio 2010 Premium ed.

Это из-за невозможности пройти событие после сборки.

Вот что временно решает проблему

  • Иногда: перезапуск Visual Studio, и я могу построить решение
  • Иногда: и перезапуск Visual Studio, и мой файловый менеджер (Q-Dir 4.37) решают его.

Вот как выглядит событие после сборки:

xcopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)" /Y

Когда вы получаете копию команды, завершенную с кодом [insert value], это обычно происходит из-за следующего:

  • разрешения на чтение / запись
  • пропущенных файлов
  • неправильные каталоги

Однако - очевидно, что иногда, когда я строю решение, проблем нет.

К вашему сведению, я удалил ReSharper 5.1.1 две недели назад, и с тех пор Visual Studio выдала мне несколько ошибок (среди которых не было возможности отладки). Я переустанавливал Visual Studio, и с тех пор он работает лучше, но проблема все еще остается. Может ли это быть связано с тем, что где-то есть ReSharper?

Была ли у вас такая же проблема и вы решили ее? Или у вас есть какое-нибудь возможное решение?

Ответы [ 27 ]

1 голос
/ 10 июля 2015

Когда я писал библиотеку DLL, я использовал команду xcopy, чтобы скопировать библиотеку, в которой программа может найти и загрузить ее. После нескольких раз открытия и закрытия программы в диспетчере задач все еще оставался открытый процесс, который я не распознал.

Найдите любой процесс, из которого можно использовать файл, и закройте его.

1 голос
/ 08 марта 2013

Я обнаружил, что установка для параметра «Копировать в выходной каталог» файла значения «Копировать всегда», похоже, устранила проблему блокировки.Хотя сейчас у меня есть 2 копии файлов, и мне нужно удалить одну.

1 голос
/ 28 января 2018

В моем случае мой $(OutDir) был просто ..\..\Build\, т.е. каким-то относительным путем. И, когда я пытался сделать копию следующим образом xcopy /y "$(OutDir)Proj1.dll" "Anypath\anyfolder\" Я получаю ошибку кода выхода 4.

То, что происходило, было то, что эта команда выполнялась в самом $ (OutDir) (в моем случае папка сборки), а не в каталоге, где находился файл csproj проекта (как мы обычно ожидаем). Следовательно, я продолжал получать File not found ошибку (соответствующую коду выхода 4).

Я не мог понять это, пока не написал cd в событиях Post Build, чтобы напечатать, в каком каталоге он выполнялся.

Итак, подведем итог: если мы хотим copy / xcopy файлы из $(OutDir), либо используйте "$(TargetDir)" (который является полным путем для выходного каталога), либо не нужно указывать какой-либо путь вообще .

0 голосов
/ 30 апреля 2019

Код ошибки 4 может означать многое, поэтому я рекомендую прочитать и другие ответы, пока не найдете решение, которое работает для вас, и не поймете, ПОЧЕМУ оно работает (некоторые решения отключают только обработку ошибок, которая может только маскировать проблема, но не решить ее).

Это может быть проблема блокировки файлов, связанная с параллельным построением. Обходной путь - не использовать параллельное построение. Это поведение по умолчанию, но если вы используете опцию -m, проекты будут создаваться параллельно. Следующие варианты не должны создавать проекты параллельно, поэтому вы не столкнетесь с проблемой блокировки файлов.

msbuild -m:1
msbuild -maxcpucount:1
msbuild

Обратите внимание, что вопреки сказанному здесь, это даже происходит с «последней» версией MSBuild (из Build Tools for Visual Studio 2019).

Лучшее решение, вероятно, - убедиться, что вам не нужно копировать файлы на этапе после сборки. В некоторых ситуациях вы также можете отключить шаги после сборки при сборке с MSBuild на сервере сборки: https://stackoverflow.com/a/55899347/2279059

0 голосов
/ 29 апреля 2019

Если вы находитесь здесь, потому что ваш проект не может быть построен на сервере сборки, но прекрасно собирается "вручную" на компьютере разработчика, и вы делаете xcopy только для отладки и эмуляции производственной среды на компьютере разработчика, тогда вы можете посмотреть на это решение:

https://stackoverflow.com/a/1732478/2279059

Вы просто отключаете события после сборки на сервере сборки, используя

msbuild foo.sln /p:PostBuildEvent=

Этого недостаточно, если у вас есть другие события после сборки, которые также должны выполняться на сервере сборки, и это не общее решение. Однако, поскольку существует много разных причин этой проблемы, не может быть общего решения. Один из многочисленных ответов на этот вопрос (и его дубликаты), вероятно, поможет, но будьте осторожны с подходами, которые только каким-то образом обходят обработку ошибок (например, xcopy /C). Они могут работать для вас, особенно в сценарии сборки сервера, но я думаю, что этот вариант более надежен, ЕСЛИ его можно использовать.

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

0 голосов
/ 13 июля 2018

Чтобы развернуть ответ rhughes,

Робокопия работает прекрасно, только если вам нужно включить подкаталоги, которые вы можете использовать /e, чтобы включить подпрограммы и скопировать пустые каталоги, или /s, чтобы включить подпрограммы, исключая пустыекаталоги.

Кроме того, robocopy сообщит о некоторых вещах, например, если будут скопированы новые файлы, это заставит VS жаловаться, так как все, что выше 0, является ошибкой, и robocopy вернет 1, если были найдены новые файлы.Стоит отметить, что robocopy сначала сравнивает Source / Dest и только копирует обновленные / новые файлы.

Чтобы обойти это использование:

(robocopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)") ^& IF %ERRORLEVEL% LEQ 4 exit /B 0
0 голосов
/ 01 декабря 2017

Может быть вызвано рабочей станцией VMWare с общими папками

У меня всегда проблема, когда папка destinatinon xcopy также отображается как общая папка в виртуальной машине.*

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...