Đăng Bản dựng đã thoát với mã 1


108

Tôi có một dự án với một sự kiện xây dựng bài đăng:

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

Nó hoạt động tốt mọi lúc trên máy của tôi. Tôi có một nhà phát triển mới luôn gặp lỗi "đã thoát với mã 1". Tôi đã cho cô ấy chạy cùng một lệnh trong lời nhắc DOS và nó hoạt động tốt. Điều gì có thể gây ra điều này? Có cách nào để nhận được lỗi thực sự?

Cả hai chúng tôi đều đang sử dụng Visual Studio 2008.


trong trường hợp của tôi, câu trả lời mà Tim Scott cung cấp ở gần cuối trang này (vì vậy tôi bỏ qua ở phần đầu) giải quyết vấn đề của tôi.
yu yang Jian

Câu trả lời:


115

Cô ấy có một khoảng trắng trong một trong các tên thư mục trong đường dẫn của cô ấy và không có dấu ngoặc kép nào xung quanh nó.


12
đặt dấu ngoặc kép trên tên đường dẫn là một thực hành tốt. không hoạt động trong các đường dẫn có chứa không gian là sự kiện tốt hơn :-)
Asher

4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" lệnh này không hoạt động với tôi và nếu tôi viết exit 0 ở cuối thì hoạt động tốt. bạn có thể cho tôi biết tại sao không?
Rikin Patel 22/10/12

59

Người có "Pings" đã giúp tôi ... nhưng có thể được giải thích tốt hơn một chút ...

Đối với tôi, giải pháp là thay đổi:

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

đến điều này:

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

Hi vọng nó sẽ giúp ích cho bạn. :-)


48

Tôi đã thêm điều này cho những khách truy cập trong tương lai vì đây là một câu hỏi khá hoạt động.

ROBOCOPY thoát với "mã thành công" dưới 8. Xem: http://support.microsoft.com/kb/954404

Điều này có nghĩa rằng:

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.

Vì vậy, tôi đã giải quyết điều này một cách dễ dàng bằng cách thêm nó vào cuối tệp hàng loạt

exit 0

Đề xuất xử lý lỗi ROBOCOPY theo kiểu này

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    

Sự nhầm lẫn sẽ được thiết lập khi không có tệp nào được sao chép = không có lỗi trong VS. Sau đó, khi có thay đổi, các tập tin bị sao chép, lỗi VS nhưng mọi thứ mà nhà phát triển muốn đã được thực hiện.

Mẹo bổ sung: Không sử dụng tạm dừng trong tập lệnh vì điều này sẽ trở thành tạm dừng vô thời hạn trong bản dựng VS. trong khi phát triển tập lệnh, hãy sử dụng một cái gì đó như timeout 10. Bạn sẽ nhận thấy điều này và bình luận nó ra hơn là có một bản dựng treo.


4
Chỉ cần những gì tôi đang tìm kiếm. Cảm ơn!!
Ricky

Lùi một câu trả lời 8 tuổi để nói rằng, nếu bạn muốn một tệp lót một dòng chứ không phải tệp dơi, bạn có thể thêm "& exit 0" vào cuối chuỗi sự kiện sau khi xây dựng.
Eric Wu

46

Lý do của tôi cho Mã 1 là thư mục đích chỉ được đọc. Hy vọng điều này sẽ giúp ai đó! Tôi đã có một sự kiện xây dựng bài đăng để thực hiện sao chép từ thư mục này sang thư mục khác và đích chỉ được đọc. Vì vậy, tôi đã đi và bỏ chọn thuộc tính chỉ đọc trên thư mục và tất cả các thư mục con của nó! Chỉ cần đảm bảo rằng nó là một thư mục an toàn để làm như vậy!


Đã lưu cho tôi một giờ, cảm ơn! Đã tải xuống một số mã từ internet và Windows 7 tự động đặt thư mục thành chỉ đọc.
Johan Petersson

1
Tôi cũng đã sử dụng xcopy thay thế và với cờ / y. Tất cả các lệnh microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson


8

Tôi đã phải chạy VS với tư cách là Quản trị viên để bản sao sau khi xây dựng của tôi sang hệ điều hành được bảo vệ ".. \ Common7 \ IDE \ PrivateAssemblies" để hoạt động


5

Đối với những người sử dụng lệnh ' sao chép ' trong Sự kiện Xây dựng ( Dòng lệnh tạo sự kiện trước hoặc / và Dòng lệnh tạo sự kiện sau xây dựng ) từ dự án -> Properties : bạn ' sao chép ' các thông số lệnh sẽ giống như ở đây: copy "source of files" "destination for files". Hãy nhớ sử dụng dấu ngoặc kép (để tránh các vấn đề với dấu cách trong chuỗi địa chỉ).


4

Tôi đã gặp sự cố tương tự nhưng đặc biệt là trong môi trường xây dựng Jenkins. Để khắc phục sự cố, tôi đã chuyển từ sử dụng lệnh sao chép trong sự kiện tạo bài đăng sang sử dụng mục tiêu sao chép.

Tôi đã thay đổi điều này:

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

đến điều này:

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

và nó hoạt động tốt bây giờ.

Lỗi cụ thể mà tôi gặp phải là:

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

Bạn đã thực hiện thay đổi đó như thế nào? Bạn đã chỉnh sửa thủ công đó? Làm thế nào để bạn thực hiện mục tiêu? Điều đó trông giống như một cái gì đó bạn phải chỉ định trong dòng lệnh msbuild. Tôi gặp phải vấn đề tương tự trong môi trường jenkins của mình, điều này thật kỳ lạ vì tất cả các thư mục được tạo trên msbuild luôn ở chế độ chỉ đọc. Tại sao nó sao chép tốt trên máy của tôi nhưng không phải trong máy chủ là ngoài tôi.
shawn1874,

Tôi vừa sử dụng Notepad ++ để chỉnh sửa tệp csproj. Hook "AfterBuild" là một hook tiêu chuẩn, vì vậy nếu tồn tại, nó sẽ được gọi tự động sau quá trình xây dựng.
TechSavvySam

Cảm ơn. Tôi không chắc liệu bạn có tệp msbuild tùy chỉnh với đích hay đó chỉ là tệp trực quan do studio tạo. FYI: Trong trường hợp của tôi, tôi nhận ra rằng vấn đề liên quan đến trật tự xây dựng. Tôi đã quên thiết lập các phụ thuộc xây dựng trong bản phát hành, cấu hình giải pháp, vì vậy các dự án đang xây dựng trên máy chủ theo một thứ tự khác để tệp đầu vào chưa có sẵn khi bản sao được thực thi. Đảm bảo rằng tệp .dll được tạo ra trước khi dự án khác cần nó sửa lỗi cho tôi. Đó là một vấn đề rất nhỏ với cấu hình giải pháp gây ra nó.
shawn1874,

Lúc đầu, không rõ ràng là thứ tự xây dựng dành cho mỗi cấu hình. Tôi nghĩ rằng đó là một cài đặt giải pháp nhưng rõ ràng bạn phải cập nhật thứ tự xây dựng trong TẤT CẢ các cấu hình.
shawn1874,

3

Tôi đã có thể sửa Mã 1 của mình bằng cách chạy Visual Studio với tư cách Quản trị viên. Rõ ràng nó không có quyền truy cập để thực hiện các lệnh shell mà không có Admin.



2

Đối với tôi, tôi phải đảm bảo rằng chương trình mà tôi đang xử lý tệp không chạy vào thời điểm đó. Không có bất kỳ lỗi nào trong cú pháp. Hy vọng điều này sẽ giúp ai đó.


2

Tôi chỉ nhận được cùng một lỗi. Tôi có một% trong đường dẫn đích cần được thoát

c:\projects\%NotAnEnvironmentVariable%

cần thiết để trở thành

c:\projects\%%NotAnEnvironmentVariable%%

2

Ok, đây là một vấn đề có nhiều giải pháp, vì vậy tôi chỉ đăng bài của tôi để cung cấp cho mọi người thêm gợi ý. Tình huống của tôi là kiểm tra kỹ các thư mục trong đường dẫn của bạn và đảm bảo rằng tất cả chúng đều tồn tại trong máy của bạn. Ví dụ: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb", nhưng "Bin" không nằm trong thư mục partBin.


1
BTW, \ after $(SolutionDir)là dư thừa.
Diablo

2

Đối với những người sử dụng lệnh 'sao chép' trong Sự kiện Xây dựng (Dòng lệnh tạo sự kiện trước hoặc / và dòng lệnh Hậu tạo sự kiện) từ Dự án -> Thuộc tính: thư mục đích nên tồn tại


0

Rất nhiều giải pháp ...

Trong trường hợp của tôi, tôi phải lưu tệp dơi bằng mã hóa không phải unicode (Western, Windows). Theo mặc định khi tôi thêm tệp vào visual studio (và có lẽ tôi nên thực hiện nó bên ngoài VS), nó được thêm mã hóa UTF-8.


0

Tôi gặp vấn đề tương tự và hóa ra là do tôi đã đổi tên dự án. Tôi đã đi vào các thuộc tính của dự án và thay đổi Tên hội và Không gian tên gốc thành tên dự án và nó hoạt động tốt sau đó!


0

Tuy nhiên, một câu trả lời khác ...

Trong trường hợp của tôi, tôi có một dự án Visual Studio 2017 nhắm mục tiêu cả .Net Standard 1.3 và .Net Framework 2.0. Điều này đã được chỉ định trong tệp .csproj như sau:

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

Tôi cũng có một dòng lệnh sau khi xây dựng sự kiện như thế này:

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

Nói cách khác, tôi đang cố gắng sao chép .Net Framework .dll được tạo bởi bản dựng sang một vị trí thay thế.

Điều này không thành công với lỗi này khi tôi tạo lại:

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

Sau nhiều lần thất vọng, cuối cùng tôi đã xác định rằng điều đang xảy ra là Rebuild đã xóa tất cả các tệp đầu ra, sau đó thực hiện xây dựng cho .Net Standard 1.3, sau đó cố gắng chạy dòng lệnh sự kiện sau xây dựng, lỗi này không thành công vì tệp được sao chép vẫn chưa được xây dựng.

Vì vậy, giải pháp là thay đổi thứ tự xây dựng, tức là xây dựng cho .Net Framework 2.0 trước, sau đó cho .Net Standard 1.3.

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

Điều này hiện hoạt động, với một trục trặc nhỏ là dòng lệnh sự kiện sau xây dựng đang được chạy hai lần, vì vậy tệp được sao chép hai lần.


0

Trong trường hợp của tôi, tôi phải cd(thay đổi thư mục) trước khi gọi tệp dơi, vì bên trong tệp dơi là một thao tác sao chép chỉ định các đường dẫn tương đối.

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.