Сборка публикации завершена с кодом 1

108

У меня есть проект с пост-сборкой:

copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe  $(TargetDir)

На моей машине все работает нормально. У меня есть новый разработчик, который всегда получает ошибку «завершился с кодом 1». Я попросил ее запустить ту же команду в командной строке DOS, и она сработала нормально. Что может быть причиной этого? Есть ли способ добраться до реальной ошибки?

Мы оба используем Visual Studio 2008.

Тим Скотт
источник
в моем случае ответ, который Тим Скотт предоставил в конце этой страницы (так что я упускаю из виду в начале), решает мою проблему.
yu yang Jian

Ответы:

115

В пути к одному из имен папок у нее был пробел, а не кавычки.

Тим Скотт
источник
12
заключать имена путей в кавычки - это хорошая практика. не работает в путях, содержащих пробелы, лучше :-)
Ашер
4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" эта команда не работает для меня, и если я напишу exit 0 в конце, тогда все будет нормально. можешь сказать мне почему?
Рикин Патель,
59

Тот, у кого есть "пинги", помог мне ... но можно объяснить немного лучше ...

Для меня решение было изменить:

copy $(TargetDir)$(TargetName).* $(SolutionDir)bin

к этому:

copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"

Надеюсь, это сработает для вас. :-)

JanBorup
источник
48

Я добавил это для будущих посетителей, так как это довольно активный вопрос.

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. Вы заметите это и закомментируете это, а не получите зависшую сборку.

Валамас
источник
4
Именно то, что я искал. Спасибо!!
Рики
Выталкивая ответ 8-летней давности, чтобы сказать, что если вам нужен однострочный файл, а не файл bat, вы можете добавить «& exit 0» в конец строки события после сборки.
Эрик Ву,
46

Моя причина для кода 1 заключалась в том, что целевая папка была доступна только для чтения. Надеюсь, это кому-то поможет! У меня было событие пост-сборки, чтобы сделать копию из одного каталога в другой, и место назначения было только для чтения. Итак, я просто пошел и снял отметку с атрибута только для чтения в каталоге и во всех его подкаталогах! Просто убедитесь, что это безопасный каталог!

Шалини
источник
Сэкономил мне час, спасибо! Загрузил некоторый код из Интернета, и Windows 7 автоматически устанавливает папку только для чтения.
Johan Petersson
1
Я также использовал xcopy вместо этого и с флагом / y. Все команды microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson
8

Мне пришлось запустить VS от имени администратора, чтобы моя копия после сборки работала в защищенной ОС ".. \ Common7 \ IDE \ PrivateAssemblies".

Wruckie
источник
5

Для тех, кто использует « копию » команду в Строительства События ( командной строке события Pre-сборки или / и командной строке события после сборки ) из проекта -> Свойства : вы « копировать » параметры команды должны выглядеть как здесь: copy "source of files" "destination for files". Не забывайте использовать кавычки (чтобы избежать проблем с пробелами в адресных строках).

Богдан Куц
источник
4

У меня была аналогичная проблема, но конкретно в среде сборки Jenkins. Чтобы решить эту проблему, я переключился с использования команды копирования в событии post build на использование цели копирования.

Я изменил это:

   <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]>
TechSavvySam
источник
Как вы внесли это изменение? Вы редактировали это вручную? Как достичь цели? Это похоже на то, что вам нужно указать в командной строке msbuild. У меня такая же проблема в моей среде jenkins, что странно, потому что все папки, созданные msbuild, всегда доступны только для чтения. Почему он отлично копирует на моей машине, а не на сервере, не понимаю.
shawn1874
Я просто использовал Notepad ++ для редактирования файла csproj. Перехватчик «AfterBuild» является стандартным, поэтому, если он существует, он вызывается автоматически после процесса сборки.
TechSavvySam
Спасибо. Я не был уверен, есть ли у вас собственный файл msbuild с целью или это был просто файл, созданный Visual Studio. К вашему сведению: в моем случае я понял, что проблема связана с порядком сборки. Я забыл установить зависимости сборки в выпуске, конфигурации решения, чтобы проекты строились на сервере в другом порядке, так что входной файл еще не был доступен на момент выполнения копии. Убедился, что .dll был создан до того, как другой проект, который нуждался в нем, исправил его для меня. Это была очень тонкая проблема с конфигурацией решения, которая ее вызвала.
shawn1874 07
Сначала не было очевидно, что порядок сборки соответствует каждой конфигурации. Я думал, что это скорее настройка решения, но, очевидно, вам нужно обновить порядок сборки во ВСЕХ конфигурациях.
shawn1874 07
3

Я смог исправить свой код 1, запустив Visual Studio от имени администратора. По-видимому, у него не было доступа для выполнения команд оболочки без администратора.

Jdurden
источник
2

Что касается меня, я должен был убедиться, что программа, в которую я копировал файл, не работала в то время. В синтаксисе ошибок не было. Надеюсь, это кому-то поможет.

Ричард С.
источник
2

Я получил ту же ошибку. У меня был% в пути назначения, который нужно было экранировать

c:\projects\%NotAnEnvironmentVariable%

должен быть

c:\projects\%%NotAnEnvironmentVariable%%
светлячок
источник
2

Хорошо, это проблема со многими решениями, поэтому я просто публикую свое, чтобы дать людям больше подсказок. Моя ситуация состоит в том, чтобы дважды проверить папки на вашем пути и убедиться, что все они существуют на вашем компьютере. Например: «$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb», но «Bin» отсутствует в папке partBin.

Дэвид
источник
1
Кстати, \ after $(SolutionDir)является избыточным.
Diablo
2

Для тех, кто использует команду «копировать» в событиях сборки (командная строка события перед сборкой и / или командная строка события после сборки) из проекта -> Свойства: целевая папка должна существовать

синхронизированный
источник
0

Так много решений ...

В моем случае мне пришлось сохранить bat-файл в кодировке, отличной от Unicode (Western, Windows). По умолчанию, когда я добавлял файл в визуальную студию (и, вероятно, мне следовало сделать это за пределами VS), он добавлялся в кодировке UTF-8.

Тенгиз
источник
0

У меня была такая же проблема, и оказалось, что это потому, что я переименовал проект. Я вошел в свойства проекта и изменил имя сборки и корневое пространство имен на имя проекта, и после этого он отлично работал!

Голгофан3
источник
0

Еще один ответ ...

В моем случае у меня был проект 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, созданную сборкой, в альтернативное место.

Это не помогло с этой ошибкой, когда я сделал перестройку:

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>

Теперь это работает, с незначительной ошибкой, когда командная строка события после сборки запускается дважды, поэтому файл копируется дважды.

РенниПет
источник
0

В моем случае мне пришлось cd(сменить каталог) перед вызовом файла bat, потому что внутри файла bat была операция копирования с указанием относительных путей.

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
CrazyTim
источник