Po zakończeniu kompilacji z kodem 1


108

Mam projekt ze zdarzeniem po kompilacji:

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

Działa dobrze za każdym razem na moim komputerze. Mam nowego programistę, któremu zawsze pojawia się błąd „Zakończono z kodem 1”. Kazałem jej uruchomić to samo polecenie w wierszu poleceń DOS i działało dobrze. Co może być tego przyczyną? Czy jest jakiś sposób, aby dojść do prawdziwego błędu?

Oboje używamy Visual Studio 2008.


w moim przypadku odpowiedź udzielona przez Tima Scotta pod koniec tej strony (więc na początku pomijam) rozwiązuje mój problem.
yu yang Jian

Odpowiedzi:


115

Miała spację w jednej z nazw folderów na swojej ścieżce i nie było wokół niej cudzysłowów.


12
umieszczanie cudzysłowów na nazwach ścieżek jest dobrą praktyką. brak pracy na ścieżkach zawierających przestrzeń jest lepszym wydarzeniem :-)
Asher

4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" to polecenie nie działa dla mnie i jeśli napiszę exit 0 na końcu, to działa dobrze. możesz mi powiedzieć dlaczego?
Rikin Patel

59

Ten z „pingami” pomógł mi ... ale można to wyjaśnić trochę lepiej ...

Dla mnie rozwiązaniem była zmiana:

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

do tego:

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

Mam nadzieję, że to działa dla Ciebie. :-)


48

Dodałem to dla przyszłych gości, ponieważ jest to dość aktywne pytanie.

ROBOCOPY kończy pracę z „kodami sukcesu” poniżej 8. Zobacz: http://support.microsoft.com/kb/954404

To znaczy że:

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.

Więc rozwiązałem to łatwo, dodając to na dole pliku wsadowego

exit 0

Zaproponuj, aby w ten sposób obsłużyć błędy 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    

Zamieszanie pojawi się, gdy żadne pliki nie zostaną skopiowane = brak błędu w VS. Potem, gdy są zmiany, pliki są kopiowane, błędy VS, ale wszystko, czego chciał programista, zostało zrobione.

Dodatkowa wskazówka: nie używaj pauzy w skrypcie, ponieważ stałoby się to nieokreśloną przerwą w kompilacji VS. podczas tworzenia skryptu użyj czegoś takiego jak timeout 10. Zauważysz to i raczej skomentujesz, niż będziesz miał wiszącą konstrukcję.


4
Właśnie tego szukałem. Dzięki!!
Ricky,

Wpadając na ośmioletnią odpowiedź, która mówi, że jeśli chcesz mieć jednowierszowy plik, a nie plik bat, możesz dodać „& exit 0” na końcu ciągu zdarzenia po kompilacji.
Eric Wu

46

Mój powód dla Code 1 był taki, że folder docelowy był tylko do odczytu. Mam nadzieję, że to komuś pomoże! Miałem zdarzenie po kompilacji, aby wykonać kopię z jednego katalogu do drugiego, a miejsce docelowe było tylko do odczytu. Więc po prostu usunąłem zaznaczenie atrybutu tylko do odczytu w katalogu i wszystkich jego podkatalogach! Po prostu upewnij się, że jest to bezpieczny katalog!


Zaoszczędziłeś mi godzinę, dzięki! Pobrałem kod z Internetu, a system Windows 7 automatycznie ustawia folder jako tylko do odczytu.
Johan Petersson

1
Zamiast tego użyłem również xcopy iz flagą / y. Wszystkie polecenia microsoft.com/resources/documentation/windows/xp/all/proddocs/ ...
Johan Petersson


8

Musiałem uruchomić VS jako administrator, aby moja kopia po kompilacji do chronionego systemu operacyjnego „.. \ Common7 \ IDE \ PrivateAssemblies” działała


5

Dla tych, którzy korzystają z „ kopii ” polecenie Build Events ( linii poleceń Pre-build zdarzeń i / lub wiersza poleceń Post-build zdarzeń ) z Project -> Properties : ty „ skopiować ” parametry polecenia powinna wyglądać tutaj: copy "source of files" "destination for files". Pamiętaj, aby używać cudzysłowów (aby uniknąć problemów ze spacjami w ciągach adresów).


4

Miałem podobny problem, ale szczególnie w środowisku kompilacji Jenkins. Aby rozwiązać ten problem, przełączyłem się z używania polecenia copy w zdarzeniu po kompilacji na używanie celu kopiowania.

Zmieniłem to:

   <PropertyGroup>
      <PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
   </PropertyGroup>

do tego:

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
  </Target>

i teraz działa dobrze.

Konkretny błąd, który otrzymałem, to:

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

Jak dokonałeś tej zmiany? Czy edytowałeś to ręcznie? Jak wykonujesz cel? To wygląda na coś, co musisz określić w wierszu poleceń msbuild. Mam dokładnie ten sam problem w moim środowisku Jenkins, co jest dziwne, ponieważ wszystkie foldery utworzone przez MSBuild są zawsze tylko do odczytu. Dlaczego dobrze kopiuje na moim komputerze, ale nie na serwerze, jest poza mną.
shawn1874

Właśnie użyłem Notepad ++ do edycji pliku csproj. Punkt zaczepienia „AfterBuild” jest standardowym punktem zaczepienia, więc jeśli istnieje, jest wywoływany automatycznie po procesie budowania.
TechSavvySam

Dzięki. Nie byłem pewien, czy masz niestandardowy plik msbuild z celem, czy był to tylko plik utworzony przez Visual Studio. FYI: W moim przypadku doszedłem do wniosku, że problem dotyczy kolejności kompilacji. Zapomniałem ustawić zależności kompilacji w wydaniu, konfiguracji rozwiązania, więc projekty były budowane na serwerze w innej kolejności, tak że plik wejściowy nie był jeszcze dostępny podczas wykonywania kopii. Upewniłem się, że plik .dll został wyprodukowany przed innym projektem, który go potrzebował, naprawił go za mnie. To był bardzo subtelny problem z konfiguracją rozwiązania, która go spowodowała.
shawn1874

Na początku nie było oczywiste, że kolejność budowania dotyczy każdej konfiguracji. Myślałem, że to raczej ustawienie rozwiązania, ale najwyraźniej musisz zaktualizować kolejność kompilacji we WSZYSTKICH konfiguracjach.
shawn1874

3

Udało mi się naprawić mój kod 1, uruchamiając program Visual Studio jako administrator. Najwyraźniej nie miał dostępu do wykonywania poleceń powłoki bez administratora.



2

Musiałem się upewnić, że program, do którego kopiowałem plik, nie działa w tym czasie. W składni nie było żadnych błędów. Mam nadzieję, że to komuś pomoże.


2

Właśnie otrzymałem ten sam błąd. Miałem% na ścieżce docelowej, z którego trzeba było uciec

c:\projects\%NotAnEnvironmentVariable%

musiał być

c:\projects\%%NotAnEnvironmentVariable%%

2

Ok, to jest problem z wieloma rozwiązaniami, więc po prostu publikuję swoje, aby dać ludziom więcej wskazówek. Moja sytuacja polega na podwójnym sprawdzeniu folderów na twojej ścieżce i upewnieniu się, że wszystkie istnieją na twoim komputerze. Na przykład: „$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb”, ale „Bin” nie znajduje się w folderze partBin.


1
BTW, \ after $(SolutionDir)jest zbędne.
Diablo,

2

Dla tych, którzy używają polecenia `` kopiuj '' w zdarzeniach kompilacji (wiersz poleceń zdarzenia przed kompilacją lub / lub wiersz poleceń zdarzenia po kompilacji) z poziomu Projekt -> Właściwości: folder docelowy powinien istnieć


0

Tyle rozwiązań ...

W moim przypadku musiałem zapisać plik bat z kodowaniem innym niż Unicode (Western, Windows). Domyślnie, kiedy dodałem plik do Visual Studio (i prawdopodobnie powinienem był to zrobić poza VS), dodano go z kodowaniem UTF-8.


0

Miałem ten sam problem i okazało się, że to dlatego, że zmieniłem nazwę projektu. Wszedłem do właściwości projektu i zmieniłem nazwę zespołu i główną przestrzeń nazw na nazwę projektu i po tym działało świetnie!


0

Jeszcze inna odpowiedź ...

W moim przypadku miałem projekt Visual Studio 2017 przeznaczony zarówno dla .Net Standard 1.3, jak i .Net Framework 2.0. Zostało to określone w pliku .csproj w następujący sposób:

<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>

Miałem również wiersz poleceń po kompilacji, taki jak ten:

copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"

Innymi słowy, próbowałem skopiować plik .Net Framework .dll utworzony przez kompilację do alternatywnej lokalizacji.

To kończyło się niepowodzeniem z powodu tego błędu, gdy wykonałem przebudowę:

MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.

Po wielu frustracjach w końcu ustaliłem, że dzieje się tak, że Rebuild usunęło wszystkie pliki wyjściowe, a następnie wykonałem kompilację dla .Net Standard 1.3, a następnie spróbowałem uruchomić wiersz poleceń zdarzenia po kompilacji, co nie powiodło się, ponieważ plik do skopiowania nie został jeszcze zbudowany.

Rozwiązaniem była więc zmiana kolejności budowania, tj. Najpierw zbuduj dla .Net Framework 2.0, a potem dla .Net Standard 1.3.

<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>

Teraz to działa, z drobną usterką polegającą na tym, że wiersz poleceń zdarzenia po kompilacji jest uruchamiany dwukrotnie, więc plik jest kopiowany dwukrotnie.


0

W moim przypadku musiałem cd(zmienić katalog) przed wywołaniem pliku bat, ponieważ wewnątrz pliku bat była operacja kopiowania, która określała ścieżki względne.

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.