Visual Studio: Birden çok derleme sonrası komut?


102

Visual Studio 2008, bir komut bildirmeme ve bunu bir proje için derleme sonrası olayına eklememe izin veriyor. Birçok geliştirici gibi, dosyaları uygulama çıktı dizinine xcopy olarak düzenli olarak kullanıyorum.

Dosyaları tek bir proje içinde iki farklı yerden iki farklı hedefe x copy ihtiyacım olan bir proje üzerinde çalışıyorum. Diğer bir deyişle, aynı derleme sonrası olayından iki farklı xcopy komutunu çağırmam gerekiyor. Görünüşe göre post-build olayı sadece tek bir komut alacak ve birden fazla komut çağırmam gerekirse komutları bir * .bat dosyasına koymam ve bunu post-build olayından çağırmam gerekecek.

Bu doğru mu yoksa derleme sonrası olayından iki komutu çağırmanın daha basit bir yolu var mı? Yardımın için şimdiden teşekkür ederim.

Yanıtlar:


126

İstediğiniz kadar post build komutu yazabilirsiniz. Sadece satır başlarına göre ayırın.

İşte projelerimden birinden bir örnek.

Derleme Sonrası Etkinlik Komut Satırı


3
Bir ekran görüntüsü eklemek, yalnızca onu sonsuza kadar barındırmayı planlıyorsanız yararlıdır.
Amandalishus

1
@ OWenJ23 ... veya bu durumda 'imge hack';)
Anthony Walsh 13

29
Ayrı satırlarda olmalarına rağmen komutlarım tek bir satırdaymış gibi birlikte çalıştırılıyor.
Trevor

6
Ne yazık ki, ara komutlardan biri başarısız olursa en azından VS2015 bir hata bildirmiyor gibi görünüyor ... derleme sonrası adımın sonucu olarak son komutun sonucunu bildiriyor.
Johannes S.

3
Görünüşe göre bu Visual Studio'nun içinden çalışıyor - ancak bir TFS oluşturma makinesinde MsBuild kullanıyorsanız desteklenmiyor. MsBuild satır sonlarını çıkarır ve kötü sözdizimi nedeniyle komutu başarısız olur.
Jeff B

107

Önemli: Bir toplu iş dosyasını çalıştırırken, aşağıdaki satırların yürütülmesi için "call" deyimini kullanmanız gerekir. "Call" kullanmazsanız, yürütme .bat dosyasına gider ve sonraki satırlara geri dönmez. DOS komut isteminde olduğu gibi.

Örneğin:

call MyBatch1.bat
call MyBatch2.bat

3
Bu ipucu grunt ve npm komutları için geçerlidir, çünkü ikisi de toplu iş dosyalarında (grunt.cmd ve npm.cmd) çalışır.
Matt Varblow

16

Başka bir seçenek daha var: komutları ile ayırabilirsiniz &&. Örneğin

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

Bu, yeni satırlarla ayırmakla tam olarak aynı değildir: ile &&, önceki komut başarısız olursa, sonraki komut çalışmayacaktır.

Satırsonu ile ayırmak daha kolay okunur, bu yüzden tercih etmelisiniz. Bununla birlikte &&, yararlı olduğu en az bir durum biliyorum . Farklı makinelerde farklı inşa sonrası adımlara sahip olmak için özellik sayfalarını kullandığınızda bu senaryodur. VS 2008, PostBuildStep'in doğrudan özellik sayfalarında ayarlanmasına izin vermez, ancak komutunuzla bir kullanıcı makrosu ekleyebilir ve ana proje ayarlarından çağırabilirsiniz. Bir makro tek satırdır, böylece &&orada birden çok komuta sahip olmak için kullanabilirsiniz .


11

Her komut ayrı bir satırda olmalıdır. Yine de bulduğum şey, bu komutlardan birini çalıştırırken bir hata varsa, tüm derleme sonrası başarısız olur ve bu nedenle, hata ayıklamak için her bir derleme sonrası komutu birer birer denemeniz gerekir.


2
"xcopy / f", hatadan önce yazdırılacak olan tam kaynağı ve hedef dosya adını gösterecek ve birden çok xcopy komutunun teşhis edilmesini, birden çok kopya komutundan daha kolay hale getirecektir.
yoyo

9

Komutları & veya && veya ile ayırmak; VS2017'de çalışmaz. Bu kadar basit işlevselliğin VS2017'de mevcut olmadığına inanamıyorum. Visual studio, post build olay penceresindeki metnin tamamını tek bir dize olarak yürütmeye çalışır. Şu anda benim için tek seçenek, özellikle hoşlanmadığım bir toplu komut dosyası oluşturmak.


1
Komutları && ile ayırmak benim için VS2017'de çalışıyor. VS2017 düzenleyicisinde her bir komutu ayrı bir satırda belirtmek benim için çalışmıyor.
codniffer

5

Ekleme Womp 'ın cevabı :

Aynı build olayında yapılacak bir şey içeren birden fazla özellik sayfanız varsa, komutları zincirlemek için aşağıdakileri yapabilirsiniz:

%(Command)
echo foo

burada %(Command)komutunun önceki değerine kadar genişler.

Şahsen bunu tüm yapı olayları için yapıyorum , şu anda devralınan komutlarım olmasa bile, çünkü bu, daha sonra özellik sayfaları eklersem sorun olmayacağını garanti eder.


1
Bu, Özel Derleme Adımıyla da çalışır. Ayrıca, exitzincir boyunca herhangi bir yerde bir toplu iş ifadesinin yürütülmesi zincirin iptal edilmesine neden olur. Indeed , adımı iptal exit 1ederken yapının başarısız olmasına neden olur exit 0ve yapı devam eder.
Martin Connell

3

Visual Studio 2017'de şunları yapabilirsiniz:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

1
.Csproj dosyasını düzenledim ve iki postbuild olay komutumun etrafına <Command> </Command> ekledim. Bu işe yaramadı. Visual Studio'da Derleme Olayları'na baktığımda, iki komutun etrafında <Command> </Command> vardı, ancak bir yapı hatası verdi: "<Command xmlns =" ​​.. "> command1 command2 </Command>" komutu 255 koduyla çıkıldı.
Jimmy

2

Womp tarafından önerilen yaklaşım, Visual Studio 2015 / 2017'de (Windows) çalışır, ancak yalnızca komutlardan ilkini çalıştırıyor gibi görünen Mac için Visual Studio'da (Önizleme) çalışmaz. Visual Studio'nun hem Mac hem de Windows sürümlerinde çalışırken bulduğum tek yaklaşım, 2 MSBuild komutunu zincirlemekti:

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

Yukarıdaki örnek, "AfterResolveReferences" olayını kullanır, ancak açıkça PostBuild olayı için de çalışmalıdır.


1

Bu sorunun iyi bir çözümü yok. Çağrı fikri, diğer komut dosyalarının çalışmasına neden olur. Hata tespitinin çalışmayacağını fark ettim. FailMe.cmd'ye 'exit / b 1' koyun Oluşturma sonrası adımlarda 'call FailMe.cmd' kullanın. Yapının başarısız olmadığını fark ettiniz mi? VS 2017'yi bir C # projesi oluştururken kullanıyorum. Şimdi 'FailMe.cmd' ile deneyin Yapı artık bir hata bildiriyor.

Hata raporlama önemliyse, tek bir komut dosyası kullanmanız daha iyi olabilir.


-4

Yalnızca toplu komut dosyanıza "çağrı" ön ekini ekleyin. Böylece, Batch komut dosyasının altındaki ifadeler, çağrı toplu komut dosyasından döndürüldükten sonra da yürütülür.

call Script1.cmd
call Script2.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.