Ответ 1
У нее было место в одном из названий папок на ее пути и никаких кавычек вокруг него.
У меня есть проект с событием post post:
copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe $(TargetDir)
Он отлично работает каждый раз на моей машине. У меня есть новый разработчик, который всегда получает ошибку "exited with code 1". Я попросил ее запустить ту же команду в подсказке DOS, и она отлично работала. Что может быть причиной этого? Есть ли способ получить реальную ошибку?
Мы оба используем Visual Studio 2008.
У нее было место в одном из названий папок на ее пути и никаких кавычек вокруг него.
Один с "Пингсом" помог мне... но может быть объяснено немного лучше...
Для меня решение должно было измениться:
copy $(TargetDir)$(TargetName).* $(SolutionDir)bin
:
copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"
Надеюсь, это сработает для вас.: -)
Моя причина для кода 1 заключалась в том, что целевая папка была только для чтения. Надеюсь, это поможет кому-то! У меня было событие post build, чтобы сделать копию из одного каталога в другой, и пункт назначения был только для чтения. Поэтому я просто ушел и снял флажок только для чтения в каталоге и во всех его подкаталогах! Просто убедитесь, что это каталог, который безопасен для этого!
Я добавил это для будущих посетителей, так как это довольно активный вопрос.
ROBOCOPY завершает работу с "кодами успеха", которые не достигли 8. См.: http://support.microsoft.com/kb/954404
Это означает, что:
robocopy exit code 0 = no files copied
robocopy exit code 1 = files copied
When the result is 1, this becomes an error exit code in visual studio.
Итак, я решил это легко, добавив это в конец командного файла
exit 0
Предложите обрабатывать ошибки ROBOCOPY таким образом
rem each robocopy statement and then underneath have the error check.
if %ERRORLEVEL% GEQ 8 goto failed
rem end of batch file
GOTO success
:failed
rem do not pause as it will pause msbuild.
exit 1
:success
exit 0
Путаница наступит, когда не будет скопировано ни одного файла = нет ошибки в VS. Затем, когда есть изменения, файлы копируются, ошибки VS, но все, что хотел разработчик, было сделано.
Дополнительный совет: не используйте паузу в скрипте, так как это станет неопределенной паузой в сборке VS. при разработке сценария используйте что-то вроде timeout 10
. Вы заметите это и закомментируете это вместо того, чтобы иметь зависание сборки.
Получить монитор процесса из SysInternals настройте его для просмотра Lunaverse.DbVerse(в поле "Путь" ), посмотрите на результат операции. Оттуда должно быть очевидно, что пошло не так.
Мне пришлось запустить VS в качестве администратора, чтобы получить мою копию пост-сборки для защищенной ОС "..\Common7\IDE\PrivateAssemblies" для работы
Для тех, кто использует команду копировать 'в Строить события (Командная строка события предварительной сборки или/и Сообщение -строчная команда) из Проект → Свойства: параметры командной строки копировать "должны выглядеть вот так: copy "source of files" "destination for files"
. Не забудьте использовать кавычки (чтобы избежать проблем с пробелами в строках адреса).
У меня была аналогичная проблема, но особенно в среде сборки Jenkins. Чтобы устранить проблему, я переключился с использования команды копирования в событии пост-сборки на использование цели копирования.
Я изменил это:
<PropertyGroup>
<PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
</PropertyGroup>
:
<Target Name="AfterBuild">
<Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
</Target>
и теперь он отлично работает.
Конкретная ошибка, которую я получал, была:
(PostBuildEvent target) ->
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "copy <http://1.2.3.4/job/BLAHv2/ws/Api/bin/BLAH.Common.xml> <http://1.2.3.4/job/BLAHv2/ws/Api/App_Data/BLAH.Common.xml"> exited with code 1. [<http://1.2.3.4/job/BLAHv2/ws/Api/Api.csproj]>
Мне удалось исправить мой код 1, запустив Visual Studio в качестве администратора. По-видимому, у него не было доступа для выполнения команд оболочки без Admin.
В качестве хорошей практики я предлагаю заменить событие post build Задача MS File File Copy.
Для меня я должен был убедиться, что программа, с которой я работал, не запускалась в то время. В синтаксисе ошибок не было. Надеюсь, это поможет кому-то.
Я получил такую же ошибку. У меня было% в пути назначения, которое нужно было экранировать
c:\projects\%NotAnEnvironmentVariable%
необходимо
c:\projects\%%NotAnEnvironmentVariable%%
Хорошо, это проблема со многими решениями, поэтому я просто отправляю сообщение, чтобы дать людям больше намеков. Моя ситуация заключается в том, чтобы дважды проверить папки на вашем пути и убедиться, что все они существуют на вашем компьютере. Например: "$ (SolutionDir)\partBin\Bin\$(ProjectName).pdb", но "Bin" не находится в папке partBin.
Для тех, кто использует команду "копировать" в событиях сборки (командная строка события "Создать сборку" или/или "Командная строка события после сборки" ) из "Проект" → "Свойства": должна существовать целевая папка
Так много решений...
В моем случае мне пришлось сохранить файл bat с кодировкой, отличной от юникода (Western, Windows). По умолчанию, когда я добавил файл в visual studio (и, вероятно, должен был сделать это вне VS), он добавил с кодировкой UTF-8.
У меня была эта же проблема, и оказалось, что это было потому, что я переименовал проект. Я вошел в свойства проекта и изменил имя сборки и корневое пространство имен на название проекта, и после этого он отлично поработает!
Еще один ответ...
В моем случае у меня был проект Visual Studio 2017, нацеленный как на .Net Standard 1.3, так и .Net Framework 2.0. Это было указано в файле .csproj следующим образом:
<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>
У меня также была командная строка события после сборки:
copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"
Другими словами, я пытался скопировать .Net Framework.dll, созданную при сборке, в другое место.
Это было с ошибкой, когда я сделал Rebuild:
MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.
После большого разочарования я наконец-то определил, что Rebuild удалил все выходные файлы, затем выполнил сборку для .Net Standard 1.3, а затем попытался запустить командную строку события после сборки, что не удалось из-за файла Копирование еще не построено.
Таким образом, решение состояло в том, чтобы изменить порядок сборки, то есть сначала собрать для .Net Framework 2.0, а затем для .Net Standard 1.3.
<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>
Теперь это работает, с небольшим затруднением в том, что командная строка события после сборки запускается дважды, поэтому файл копируется дважды.
В моем случае мне пришлось cd
(сменить каталог) перед вызовом файла bat, потому что внутри файла bat была операция копирования, которая указывала относительные пути.
:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"