Post Build keluar dengan kode 1

108

Saya memiliki proyek dengan acara pasca pembangunan:

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

Ini berfungsi dengan baik setiap kali di mesin saya. Saya memiliki pengembang baru yang selalu mendapatkan kesalahan "keluar dengan kode 1". Saya menyuruhnya menjalankan perintah yang sama dalam prompt DOS, dan itu berfungsi dengan baik. Apa yang menyebabkan ini? Apakah ada cara untuk mendapatkan kesalahan yang sebenarnya?

Kami berdua menggunakan Visual Studio 2008.

Tim Scott
sumber
dalam kasus saya, jawaban yang Tim Scott berikan di dekat akhir halaman ini (jadi saya abaikan di awal) memecahkan masalah saya.
yu yang Jian

Jawaban:

115

Dia memiliki spasi di salah satu nama folder di jalurnya, dan tidak ada tanda kutip di sekitarnya.

Tim Scott
sumber
12
menempatkan tanda kutip pada nama jalur adalah praktik yang baik. tidak bekerja di jalur yang berisi ruang adalah acara yang lebih baik :-)
Asher
4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" perintah ini tidak berfungsi untuk saya dan jika saya menulis keluar 0 di akhir maka berfungsi dengan baik. bisakah kamu memberitahuku mengapa?
Rikin Patel
59

Yang dengan "Ping" membantu saya ... tetapi mungkin dijelaskan sedikit lebih baik ...

Bagi saya, solusinya adalah mengubah:

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

untuk ini:

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

Semoga berhasil untuk Anda. :-)

JanBorup
sumber
48

Saya telah menambahkan ini untuk pengunjung mendatang karena ini adalah pertanyaan yang cukup aktif.

ROBOCOPY keluar dengan "kode sukses" di bawah 8. Lihat: http://support.microsoft.com/kb/954404

Artinya:

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.

Jadi saya menyelesaikan ini dengan mudah dengan menambahkan ini ke bagian bawah file batch

exit 0

Sarankan agar menangani kesalahan ROBOCOPY dengan cara ini

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    

Kebingungan akan muncul ketika tidak ada file yang disalin = tidak ada kesalahan pada VS. Kemudian ketika ada perubahan, file disalin, kesalahan VS tetapi semua yang diinginkan pengembang telah selesai.

Tip Tambahan: Jangan gunakan jeda dalam skrip karena ini akan menjadi jeda tak terbatas pada build VS. saat mengembangkan skrip, gunakan sesuatu seperti timeout 10. Anda akan melihat ini dan mengomentarinya daripada memiliki bangunan gantung.

Valamas
sumber
4
Hanya apa yang saya cari. Terima kasih!!
Ricky
Menabrak jawaban berusia 8 tahun untuk mengatakan bahwa, jika Anda menginginkan file satu baris, dan bukan file bat, Anda dapat menambahkan "& exit 0" di akhir string acara pasca-build.
Eric Wu
46

Alasan saya untuk Kode 1 adalah karena folder target hanya bisa dibaca. Semoga ini bisa membantu seseorang! Saya memiliki acara post build untuk melakukan penyalinan dari satu direktori ke direktori lain dan tujuannya hanya untuk dibaca. Jadi saya pergi dan menghapus centang pada atribut read-only pada direktori dan semua subdirektorinya! Pastikan saja bahwa itu adalah direktori yang aman untuk melakukannya!

Shalini
sumber
Menyelamatkan saya satu jam, terima kasih! Mengunduh beberapa kode dari internet dan Windows 7 mengatur folder menjadi hanya-baca secara otomatis.
Johan Petersson
1
Saya juga menggunakan xcopy sebagai gantinya dan dengan / y flag. Semua perintah microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson
8

Saya harus menjalankan VS sebagai Administrator untuk mendapatkan salinan pasca-pembuatan saya ke OS yang dilindungi ".. \ Common7 \ IDE \ PrivateAssemblies" agar berfungsi

wruckie
sumber
5

Bagi mereka, yang menggunakan ' copy ' perintah dalam Build Acara ( baris perintah Pra-build acara atau / dan baris perintah Post-build event ) dari Project -> Properties : Anda ' copy ' parameter perintah akan terlihat seperti di sini: copy "source of files" "destination for files". Ingatlah untuk menggunakan tanda kutip (untuk menghindari masalah dengan spasi dalam string alamat).

Bohdan Kuts
sumber
4

Saya memiliki masalah serupa tetapi secara khusus dalam lingkungan pembuatan Jenkins. Untuk memperbaiki masalah ini, saya beralih dari menggunakan perintah salin di acara post build menjadi menggunakan target salin.

Saya mengubah ini:

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

untuk ini:

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

dan berfungsi dengan baik sekarang.

Kesalahan spesifik yang saya dapatkan adalah:

(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
sumber
Bagaimana Anda membuat perubahan itu? Apakah Anda mengeditnya secara manual? Bagaimana Anda mengeksekusi target? Sepertinya sesuatu yang harus Anda tentukan di baris perintah msbuild. Saya memiliki masalah yang sama persis di lingkungan jenkins saya yang aneh karena semua folder yang dibuat msbuild selalu hanya-baca. Mengapa menyalin dengan baik di mesin saya tetapi tidak di server adalah di luar kemampuan saya.
shawn1874
Saya baru saja menggunakan Notepad ++ untuk mengedit file csproj. Hook "AfterBuild" adalah hook standar, jadi jika ada, hook itu dipanggil secara otomatis setelah proses build.
TechSavvySam
Terima kasih. Saya tidak yakin apakah Anda memiliki file msbuild khusus dengan target atau apakah itu hanya file yang dibuat oleh studio visual. FYI: Dalam kasus saya, saya menemukan bahwa masalahnya ada pada urutan pembuatan. Saya lupa untuk mengatur dependensi build dalam rilis, konfigurasi solusi sehingga proyek-proyek tersebut dibangun di server dalam urutan yang berbeda sehingga file input belum tersedia saat salinan dijalankan. Memastikan bahwa .dll diproduksi sebelum proyek lain yang membutuhkannya memperbaikinya untuk saya. Itu adalah masalah yang sangat halus dengan konfigurasi solusi yang menyebabkannya.
shawn1874
Tidak jelas pada awalnya bahwa urutan build adalah untuk setiap konfigurasi. Saya pikir itu lebih merupakan pengaturan solusi tetapi ternyata Anda harus memperbarui urutan build di SEMUA konfigurasi.
shawn1874
3

Saya dapat memperbaiki Kode 1 saya dengan menjalankan Visual Studio sebagai Admin. Rupanya itu tidak memiliki akses untuk menjalankan perintah shell tanpa Admin.

jdurden
sumber
2

Sebagai praktik yang baik, saya sarankan Anda mengganti acara post build dengan tugas MS Build File Copy .

Asyer
sumber
3
apa manfaat yang satu dari yang lain?
GregC
2

Bagi saya, saya harus memastikan program yang saya gunakan untuk menangani file tidak berjalan pada saat itu. Tidak ada kesalahan dalam sintaks. Semoga ini bisa membantu seseorang.

Richard S.
sumber
2

Saya baru saja menerima kesalahan yang sama. Saya memiliki% di jalur tujuan yang perlu diloloskan

c:\projects\%NotAnEnvironmentVariable%

dibutuhkan

c:\projects\%%NotAnEnvironmentVariable%%
Firefly
sumber
2

Oke, ini adalah masalah dengan banyak solusi, jadi saya hanya memposting milik saya untuk memberi lebih banyak petunjuk kepada orang-orang. Situasi saya adalah memeriksa ulang folder di jalur Anda dan memastikan semuanya ada di mesin Anda. Misalnya: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb", tetapi "Bin" tidak ada di folder partBin.

David
sumber
1
BTW, \ setelah $(SolutionDir)itu mubazir.
Diablo
2

Bagi mereka, yang menggunakan perintah 'salin' di Build Events (baris perintah peristiwa pra-bangun atau / dan baris perintah peristiwa pasca-bangun) dari Proyek -> Properti: folder target harus ada

disinkronkan
sumber
0

Begitu banyak solusi ...

Dalam kasus saya, saya harus menyimpan file bat dengan pengkodean non-unicode (Western, Windows). Secara default ketika saya menambahkan file ke studio visual (dan mungkin saya harus melakukannya di luar VS), itu ditambahkan dengan pengkodean UTF-8.

Tengiz
sumber
0

Saya mengalami masalah yang sama dan ternyata itu karena saya telah mengganti nama proyek. Saya masuk ke properti proyek dan mengubah Nama Majelis dan Root Namespace menjadi nama proyek dan itu berfungsi dengan baik setelah itu!

golgothan3
sumber
0

Namun jawaban lain ...

Dalam kasus saya, saya memiliki proyek Visual Studio 2017 yang menargetkan .Net Standard 1.3 dan .Net Framework 2.0. Ini ditentukan dalam file .csproj seperti ini:

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

Saya juga memiliki baris perintah acara pasca-pembangunan seperti ini:

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

Dengan kata lain, saya mencoba menyalin .Net Framework .dll yang dihasilkan oleh build ke lokasi alternatif.

Ini gagal dengan kesalahan ini ketika saya melakukan Rebuild:

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

Setelah banyak frustasi akhirnya saya memutuskan bahwa apa yang terjadi adalah bahwa Rebuild menghapus semua file output, kemudian melakukan build untuk .Net Standard 1.3, kemudian mencoba menjalankan baris perintah event post-build, yang gagal karena file tersebut akan disalin belum dibangun.

Jadi solusinya adalah mengubah urutan bangunan, yaitu build untuk .Net Framework 2.0 terlebih dahulu, kemudian untuk .Net Standard 1.3.

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

Ini sekarang berfungsi, dengan kesalahan kecil bahwa baris perintah peristiwa pasca-build dijalankan dua kali, sehingga file disalin dua kali.

RenniePet
sumber
0

Dalam kasus saya, saya harus cd(mengubah direktori) sebelum memanggil file bat, karena di dalam file bat adalah operasi penyalinan yang menentukan jalur relatif.

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
CrazyTim
sumber