Побудова пошти вийшла з кодом 1


108

У мене є проект із подією post build:

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

Це добре працює щоразу на моїй машині. У мене є новий розробник, який завжди отримує помилку "вийшов з кодом 1". Я змусив її виконати ту саму команду в підказці DOS, і вона спрацювала чудово. Що може бути причиною цього? Чи є спосіб перейти до реальної помилки?

Ми обидва використовуємо Visual Studio 2008.


у моєму випадку відповідь, яку Тім Скотт надає наприкінці цієї сторінки (тому я не помічаю на початку), вирішує мою проблему.
ю ян Цзянь

Відповіді:


115

У неї було пробіл в одній із назв папки на своєму шляху, і жодних лапок навколо неї немає.


12
розміщення лапок на імена шляхів - хороша практика. не працюючи в шляхах, що містять простір, краще подія :-)
Ашер

4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" ця команда не працює для мене, і якщо я запишу вихід 0 в кінці, тоді добре працюю. Ви можете сказати мені, чому?
Рікін Патель

59

Той, з "Пінгами", допоміг мені ... але, можливо, пояснюється трохи краще ...

Для мене рішенням було змінити:

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

до цього:

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

Сподіваюся, це працює для вас. :-)


48

Я додав це для майбутніх відвідувачів, оскільки це досить активне питання.

РОБОКОПІЯ закінчується "кодами успіху", яким не виповнилося 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 встановлює папку для автоматичного читання.
Йоган Петерсон

1
Я також використав xcopy замість цього та зі прапорцем / y. Усі команди microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Йохан Петерсон


8

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


5

Для тих, хто використовує « копію » команду в Будівництва Події ( командному рядку події Pre-збірки чи / та командному рядку події після складання ) з проекту -> Властивості : ви « копіювати » параметри команди повинні виглядати як тут: copy "source of files" "destination for files". Не забудьте використовувати лапки (щоб уникнути проблем із пробілами в рядках адреси).


4

У мене була схожа проблема, але конкретно в середовищі побудови Дженкінса. Щоб вирішити проблему, я перейшов від використання команди копіювання в події збірки після використання цілі копіювання.

Я змінив це:

   <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]>

Як ви внесли цю зміну? Ви це вручну редагували? Як ви виконуєте ціль? Це схоже на те, що вам доведеться вказати в командному рядку msbuild. У мене саме така проблема в моєму середовищі jenkins, що дивно, оскільки всі створені файлами msbuild папки завжди доступні лише для читання. Чому він копіює чудово на моїй машині, але не на сервері, - це поза мною.
shawn1874

Я просто використовував Notepad ++ для редагування файлу csproj. Гак "AfterBuild" - це стандартний гак, тому якщо він існує, він викликається автоматично після процесу збирання.
TechSavvySam

Дякую. Я не був впевнений, чи був у вас спеціальний файл msbuild з цільовою чи це лише файл, створений візуальною студією. FYI: У моєму випадку я зрозумів, що проблема пов'язана з порядком побудови. Я забув встановити залежності побудови у випуску, конфігурації рішення, тому проекти будувались на сервері в іншому порядку, так що вхідний файл ще не був доступний при виконанні копії. Переконайтесь, що .dll був вироблений до іншого проекту, який потребував його, виправив його для мене. Це було дуже тонке питання з конфігурацією рішення, яка його викликала.
shawn1874

Спочатку було очевидно, що порядок складання є для кожної конфігурації. Я думав, що це скоріше налаштування рішення, але очевидно, що вам доведеться оновити порядок збирання у ВСІХ конфігураціях.
shawn1874

3

Мені вдалося виправити свій код 1, запустивши Visual Studio як Адміністратор. Мабуть, у нього не було доступу для виконання команд оболонки без адміністратора.



2

Для мене я повинен був переконатися, що програма, з якою я копіював файл, не працювала на той час. У синтаксисі помилок не було. Сподіваюся, що це комусь допоможе.


2

Я щойно отримав ту саму помилку. У шляху до пункту призначення у мене був%, який потрібно було уникнути

c:\projects\%NotAnEnvironmentVariable%

потрібно було

c:\projects\%%NotAnEnvironmentVariable%%

2

Гаразд, це проблема з багатьма рішеннями, тому я просто розміщую свою, щоб дати людям більше підказок. Моя ситуація полягає в тому, щоб двічі перевірити папки на своєму шляху і переконатися, що всі вони існують у вашій машині. Наприклад: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb", але "Bin" не знаходиться в папці partBin.


1
BTW, \ після $(SolutionDir)є зайвим.
Діабло

2

Для тих, хто використовує команду "копіювати" у подіях побудови (командний рядок попереднього збирання події або / та командний рядок події після складання) з папки Project -> Properties: цільова папка повинна існувати


0

Стільки рішень ...

У моєму випадку мені довелося зберегти файл bat з кодуванням unicode (Western, Windows). За замовчуванням, коли я додав файл у візуальну студію (і, мабуть, я мав би це зробити поза межами VS), він додав кодування UTF-8.


0

У мене був цей самий випуск, і виявилося, що це було тому, що я перейменував проект. Я зайшов у властивості проекту і змінив ім'я асемблери та ім'я кореня на ім'я проекту, і це чудово спрацювало після цього!


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 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.