Gönderi Derlemesinden kod 1 ile çıkıldı


108

Post build etkinliği olan bir projem var:

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

Makinemde her seferinde iyi çalışıyor. Her zaman "kod 1 ile çıkıldı" hatasını alan yeni bir geliştiricim var. Aynı komutu bir DOS komut isteminde çalıştırmasını sağladım ve iyi çalıştı. Buna ne sebep olabilir? Gerçek hataya ulaşmanın bir yolu var mı?

İkimiz de Visual Studio 2008 kullanıyoruz.


benim durumumda, Tim Scott'ın bu sayfanın sonuna doğru verdiği cevap (bu yüzden başlangıçta gözden kaçırıyorum) sorunumu çözüyor.
yu yang Jian

Yanıtlar:


115

Yolundaki klasör adlarından birinde bir boşluk vardı ve etrafında alıntı yok.


12
yol adlarına alıntı yapmak iyi bir uygulamadır. boşluk içeren yollarda çalışmamak olay daha iyidir :-)
Asher

4
kopya / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" bu komut benim için çalışmıyor ve eğer sonunda 0 çıkışını yazarsam iyi çalışır. bana nedenini söyleyebilir misin?
Rikin Patel

59

"Pings" olanı bana yardımcı oldu ... ama biraz daha açıklanabilir ...

Benim için çözüm değişmekti:

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

buna:

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

Umarım sizin için çalışır. :-)


48

Bu oldukça aktif bir soru olduğu için bunu gelecekteki ziyaretçiler için ekledim.

ROBOCOPY, 8'in altındaki "başarı kodları" ile çıkar. Bkz: http://support.microsoft.com/kb/954404

Bunun anlamı şudur ki:

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.

Bu yüzden bunu toplu iş dosyasının altına ekleyerek kolayca çözdüm

exit 0

ROBOCOPY hatalarını bu şekilde ele almanızı önerin

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    

Hiçbir dosya kopyalanmadığında kafa karışıklığı oluşacaktır = VS'de hata yok. Sonra değişiklikler olduğunda, dosyalar kopyalanır, VS hataları, ancak geliştiricinin istediği her şey yapılır.

Ek İpucu: Komut dosyasında duraklama kullanmayın, çünkü bu VS yapısında belirsiz bir duraklama haline gelir. senaryoyu geliştirirken gibi bir şey kullanın timeout 10. Bunu fark edeceksiniz ve asılı bir yapıya sahip olmak yerine yorumlayacaksınız.


4
Tam da aradığım şey. Teşekkürler!!
Ricky

Bir yarasa dosyası değil de tek satırlık bir malzeme istiyorsanız, derleme sonrası olay dizesinin sonuna bir "& çıkış 0" ekleyebileceğinizi söylemek için 8 yıllık bir cevaba çarpmak.
Eric Wu

46

Kod 1 için nedenim, hedef klasörün salt okunur olmasıydı. Umarım bu birine yardımcı olur! Bir dizinden diğerine kopyalama yapmak için bir post build olayım vardı ve hedef salt okunurdu. Bu yüzden dizindeki ve tüm alt dizinlerindeki salt okunur özniteliğe gidip işaretini kaldırdım! Bunun için güvenli bir dizin olduğundan emin olun!


Beni bir saat kurtardı, teşekkürler! İnternetten bazı kodlar indirildi ve Windows 7, klasörü otomatik olarak salt okunur olacak şekilde ayarladı.
Johan Petersson

1
Ayrıca xcopy kullandım ve / y bayrağıyla. Tüm komutlar microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson


8

Derleme sonrası kopyamı işletim sistemi korumalı bir ".. \ Common7 \ IDE \ PrivateAssemblies" e almak için Yönetici olarak VS'yi çalıştırmam gerekiyordu


5

'Kullananlar için kopya halinde' komutunu Yapı Olaylar ( Ön build olay komut satırı ve / veya olay Post-build komut satırından itibaren) Projesi -> Özellikler : Eğer ' copy ' komutunu parametreleri burada gibi görünmelidir: copy "source of files" "destination for files". Tırnak işareti kullanmayı unutmayın (adres dizelerinde boşluklarla ilgili sorunları önlemek için).


4

Benzer bir sorunum vardı ama özellikle bir Jenkins oluşturma ortamında. Sorunu çözmek için, derleme sonrası olayında bir kopyalama komutunu kullanmaktan kopya hedefi kullanmaya geçtim.

Ben bunu değiştirdim:

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

buna:

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

ve şimdi iyi çalışıyor.

Aldığım belirli hata şuydu:

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

Bu değişikliği nasıl yaptın? Bunu elle mi düzenlediniz? Hedefi nasıl gerçekleştirirsiniz? Bu, msbuild komut satırında belirtmeniz gereken bir şeye benziyor. Benim jenkins ortamımda tam olarak aynı sorunu yaşıyorum, bu garip çünkü msbuild tarafından oluşturulan tüm klasörler her zaman salt okunur. Neden makinemde iyi kopyalayıp sunucuda kopyalamıyor beni aşıyor.
shawn1874

Csproj dosyasını düzenlemek için Notepad ++ kullandım. "AfterBuild" kancası standart bir kancadır, bu nedenle mevcutsa, oluşturma işleminden sonra otomatik olarak çağrılır.
TechSavvySam

Teşekkürler. Bir hedefe sahip özel bir msbuild dosyanız olup olmadığından veya bunun yalnızca visual studio tarafından oluşturulan dosya olduğundan emin değildim. Bilginize: Benim durumumda, sorunun inşa düzeniyle ilgisi olduğunu anladım. Sürümde, çözüm yapılandırmasında yapı bağımlılıklarını ayarlamayı unuttum, böylece projeler sunucuda farklı bir sırayla oluşturuldu, böylece kopya yürütüldüğünde girdi dosyası henüz mevcut değildi. .Dll'nin onu benim için düzeltmesi gereken diğer projeden önce üretildiğinden emin olmak. Bu, buna neden olan çözüm yapılandırmasıyla ilgili çok ince bir sorundu.
shawn1874

Her konfigürasyon için inşa sırasının olduğu ilk bakışta açık değildi. Bunun daha çok bir çözüm ayarı olduğunu düşündüm, ancak açıkça TÜM konfigürasyonlarda yapı sırasını güncellemeniz gerekiyor.
shawn1874

3

Visual Studio'yu Yönetici olarak çalıştırarak Kod 1'imi düzeltebildim. Görünüşe göre, Yönetici olmadan kabuk komutlarını yürütme erişimi yoktu.



2

Benim için, dosyayla uğraştığım programın o sırada çalışmadığından emin olmalıydım. Söz diziminde herhangi bir hata yoktu. Umarım bu birine yardımcı olur.


2

Ben de aynı hatayı aldım. Kaçılması gereken hedef yolda bir yüzdem vardı

c:\projects\%NotAnEnvironmentVariable%

olması gerekiyor

c:\projects\%%NotAnEnvironmentVariable%%

2

Tamam, bu birçok çözümle ilgili bir sorun, bu yüzden insanlara daha fazla ipucu vermek için benimkini gönderiyorum. Benim durumum, yolunuzdaki klasörleri iki kez kontrol etmek ve hepsinin makinenizde var olduğundan emin olmak. Örneğin: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjeAdı) .pdb", ancak "Bin" partBin klasöründe değil.


1
BTW, \ after $(SolutionDir)gereksizdir.
Diablo

2

Build Events (Pre-build olay komut satırı veya / ve Post-build olay komut satırı) içinde Project -> Properties'den 'copy' komutunu kullananlar için: hedef klasör mevcut olmalıdır


0

Pek çok çözüm ...

Benim durumumda, bat dosyasını unicode olmayan (Western, Windows) kodlama ile kaydetmem gerekiyordu. Varsayılan olarak dosyayı visual studio'ya eklediğimde (ve muhtemelen bunu VS'nin dışında yapmalıydım), UTF-8 kodlamasıyla eklendi.


0

Aynı sorunu yaşadım ve bunun projeyi yeniden adlandırdığım için olduğu ortaya çıktı. Proje özelliklerine girdim ve Assembly Name ve Root Namespace'i proje adına değiştirdim ve bundan sonra harika çalıştı!


0

Yine başka bir cevap ...

Benim durumumda, hem .Net Standard 1.3 hem de .Net Framework 2.0'ı hedefleyen bir Visual Studio 2017 projem vardı. Bu, .csproj dosyasında şu şekilde belirtilmiştir:

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

Ayrıca şunun gibi bir derleme sonrası olay komut satırım vardı:

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

Başka bir deyişle, yapı tarafından üretilen .Net Framework .dll'yi alternatif bir konuma kopyalamaya çalışıyordum.

Bir Yeniden Oluşturma yaptığımda bu hata ile başarısız oluyordu:

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

Çok fazla hayal kırıklığından sonra nihayet olan şeyin, Rebuild'in tüm çıktı dosyalarını sildiğine karar verdim, ardından .Net Standard 1.3 için derleme yaptıktan sonra, derleme sonrası olay komut satırını çalıştırmayı denedim, çünkü dosya kopyalanacak henüz inşa edilmedi.

Yani çözüm, yapım sırasını değiştirmekti, yani önce .Net Framework 2.0 için, sonra .Net Standard 1.3 için inşa etmek.

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

Bu, derleme sonrası olay komut satırının iki kez çalıştırılmasıyla ilgili küçük aksaklıkla birlikte çalışır, böylece dosya iki kez kopyalanır.


0

Benim durumumda cd, bat dosyasını çağırmadan önce dizini değiştirmem gerekiyordu , çünkü bat dosyasının içinde göreceli yolları belirleyen bir kopyalama işlemi vardı.

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.