Visual Studio derleme sonrası olayları yalnızca hata ayıklama derlemesi için çalıştırma


592

Derleme sonrası etkinliklerimi yalnızca bir derleme türü için çalışmayla nasıl sınırlandırabilirim?

Olayları DLL dosyalarını yerel bir IIS sanal dizinine kopyalamak için kullanıyorum, ancak bu sürümün derleme sunucusunda sürüm modunda olmasını istemiyorum.

Yanıtlar:


746

Yapım Öncesi ve Sonrası Olaylar toplu komut dosyası olarak çalışır. Tarihinde koşullu bir ifade yapabilirsiniz $(ConfigurationName).

Örneğin

if $(ConfigurationName) == Debug xcopy something somewhere

7
garip, belki sadece ben ama if koşulunu eklemeyi denedim ve şimdi bu hatayı alıyorum - hata kodu 255'ten çıktı
Michael L

101
Tüm komutun bir satırda olması gerektiğini fark ettim ya da "kod 255'ten çıkıldı"
Robin Minto,

7
Ayrıca (benim 24 Temmuz answwer bakın) dolgun çözümü için gotos / etiketleri kullanabilirsiniz
CestLaGalere

11
ve if komutuyla köşeli parantezleri kullanabilirsiniz (örnek için
cevabıma

1
Hedef dizinde dosyanın üzerine yazılması için "xcopy / Y" kullanmalısınız.
Matthias

521

Bilginize, gitmenize gerek yok. Kabuk IF komutu yuvarlak parantezlerle kullanılabilir:

if $(ConfigurationName) == Debug (
  copy "$(TargetDir)myapp.dll" "c:\delivery\bin" /y
  copy "$(TargetDir)myapp.dll.config" "c:\delivery\bin" /y
) ELSE (
  echo "why, Microsoft, why".
)

62
Ayrıca, if ifadesini hemen takip etmesi gereken açılış parantezine dikkat etmek için, bir sonraki
satırdaymış

37
"$(ConfigurationName)"Hata kodu 255 alırsanız kullanın (tırnaklara dikkat edin)
jgauffin 28:12

20
$ (ConfigurationName) etrafında "" kullanırsanız, hata ayıklama - kabuk komut IF deyimleri çok .. değişmez ... dizge karşılaştırmaları söz konusu olduğunda da tırnak işaretleri gerekir.
gbjbaanb

5
Not, 255 kurtulmak için $ "(ConfigurationName) etrafında" "kullanmak zorundayım ve koşul çevresindeki boşlukları kaldırmak zorunda, örneğin" $ (ConfigurationName) "==" Release "<- Etrafında boşluk yok ==
fhilton

15
Benim durumumda Visual Studio 2017 $(ConfigurationName)boş (Derleme sonrası olay komut satırı). if "$(Configuration)" == "Debug"benim için çalıştı. BTW, diğer tüm yapılandırmalarda bir şey yapmak istiyorsanız, kullanın if NOT "$(Configuration)" == "Debug".
Ralf Hundewadt

125

Yazı oluşturma etkinliğinizi normal gibi ekleyin. Ardından projenizi kaydedin, Not Defteri'nde (veya en sevdiğiniz düzenleyicide) açın ve PostBuildEvent özellik grubuna koşul ekleyin. İşte bir örnek:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>

5
Bu çalışır, ancak proje dosya kaynağındaki olaylar için tüm tasarım çalışmalarınızı yapmaya zorlar. Diğer koşullu derleme olay bildirimleri de IDE'den gizlenir.
Joseph Daigle

3
Bunun benim için daha iyi bir cevap olduğunu söylemeliyim, tercih edilen yöntem işe yaramadı.
Michael L

8
Not Defteri'nde açmanıza gerek yoktur, Visual Studio'da kalabilirsiniz. Proje dosyasını sağ tıklayabilir, "Projeyi kaldır" ı tıklayabilir, ardından tekrar sağ tıklayıp "Düzenle" yi tıklayabilirsiniz. Artık {{csproj}} dosyasını sözdizimi renklendirmesiyle düzenleyebilirsiniz. Tekrar sağ tıklayın, ancak şimdi yeniden yüklemek için "Projeyi yeniden yükle" yi tıklayın.
Abel

1
Bu yaklaşım, denediğimde PostBuildEvent komutundaki makroları genişletmedi. cd "$(ProjectDir)"genişletilmiş cd "".
Darryl

3
VS 2017'de bunu da yapabilirsiniz <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>. Makro değişkenler ve her şey normal çalışır.
SC

106

Alternatif olarak (olaylar bir toplu iş dosyasına konduğundan ve daha sonra çağrıldığından) aşağıdakileri kullanın (bir toplu iş dosyasında değil, Build olay kutusunda):

if $(ConfigurationName) == Debug goto :debug

:release
signtool.exe ....
xcopy ...

goto :exit

:debug
' Debug items in here

:exit

Bu şekilde herhangi bir yapılandırma için etkinlik ve hala yerine bir toplu iş dosyası içine geçmek zorunda daha makrolarıyla onu yönetmek, hatırlayabiliriz %1olduğunu $(OutputPath)vs.


6
Kodunuzun bazılarına reflektörde bakma şansınız varsa, derleyici birçok anahtar / vaka ifadesini goto'ya dönüştürür.
StingyJack

10
Çoğu derleyici kodu goto gibi daha basit talimatlara çevirir. Ve tersine mühendislik daha basit talimatları bir araya getirmeyi tercih ettiğiniz "güzel" daha karmaşık talimatlara koyamaz. Microsoft'un bizi goto kullanmamıza nasıl zorladığını veya bunun bu yazı ile ne kadar alakalı olduğunu görmüyorum.
TamusJRoyce

1
@StingyJack: Eğer derlenmiş koda bakarsanız, tüm bunların JMP talimatlarına dönüştüğünü göreceksiniz :) Güzel okunabilir kodlar yazabildiğim sürece derleyicinin kapakların altında ne yaptığı umurumda değil. (goto kullanmanın zaman zaman okunması kolay değildir)
gbjbaanb

Yapım sonrası komutlarımı bir toplu iş içine koyarsam, basın derlemesinde bu hata iletisini alıyorum:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Sebastian

4
isterseniz, kaldırabilir ifve kullanabilirsinizgoto :$(ConfigurationName)
Calimero100582

15

Visual Studio 2015: Doğru sözdizimi (bir satırda saklayın):

if "$(ConfigurationName)"=="My Debug CFG" ( xcopy "$(TargetDir)test1.tmp" "$(TargetDir)test.xml" /y) else ( xcopy "$(TargetDir)test2.tmp" "$(TargetDir)test.xml" /y)

Burada 255 hatası yok.


3
bir satırda tut
Eric Bole-Feysot

İyi çalışıyor. Tks
Vinicius Gonçalves

1
Koşullu tekniğiniz benim için en iyisini yaptı. Ancak, bu şartlı olmadan daha da iyi çalıştı ve çok daha özlü. kopyala "$ (ProjectDir) \ .. \ $ (ConfigurationName) \ MyFileName" "$ (TargetDir)"
shawn1874 1:18 '

1
Komut dosyanız doğru, ancak komut dosyam farklı yapılandırmalar için farklı dosyaların kopyalanmasına izin veriyor.
Eric Bole-Feysot

8

Visual Studio 2019'dan itibaren, modern .csprojbiçim doğrudan Targetöğeye koşul eklemeyi destekler :

<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
    <Exec Command="nswag run nswag.json" />
</Target>

Kullanıcı arayüzü bunu ayarlamak için bir yol sağlamaz, ancak Configurationkullanıcı arayüzü aracılığıyla değişiklik yaparsanız özelliği güvenli bir şekilde yerinde bıraktığı görülür .


Bu VS 2019'da benim için çalıştı, teşekkür ederim!
BrandoTheBrave

Bu gerçekten daha yüksek olmayı hak ediyor, ayrıca Yapılandırma Yapılandırmasını işaretlemenize veya en azından Durumu csproj özelliklerinden eklemenize izin vermek için gerçekten kullanıcı arayüzünü güncellemelidirler.
DeadlyChambers

4

Yapılandırma adını derleme sonrası komut dosyasına geçirebilir ve çalışıp çalışmadığını görmek için orada kontrol edebilirsiniz.

İle yapılandırma adını iletin $(ConfigurationName).

Bunu kontrol etmek, post-build adımını nasıl uyguladığınıza bağlıdır - bir komut satırı argümanı olacaktır.


-1

Bu benim için Visual Studio 2015'te çalışıyor.

Tüm DLL dosyalarını çözüm klasörümle aynı düzeydeki bir kitaplık klasöründe bulunan bir klasörden, projenin hedef dizinine kopyalarım.

Proje dizinimden göreli bir yol kullanarak ve klasör yapısını iki adım yukarı çıkarak .. \ .. \ lib

MySolutionFolder
.... MyProject
Lib

if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")

-2

Herhangi bir proje ayarı gibi, buildeventler de Konfigürasyon başına yapılandırılabilir. Özellik Sayfaları iletişim kutusunun açılır menüsünden değiştirmek istediğiniz yapılandırmayı seçmeniz ve yayın oluşturma adımını düzenlemeniz yeterlidir.


10
Derleme Olayları, IDE'de oluşturulduğunda herhangi bir yapılandırmaya özgü değildir.
Joseph Daigle

1
VS2015'te de çalışmaz. Konfigürasyon başına yapılandırılamaz.
willem

2
Bu yalnızca Visual Studio'daki C ++ projeleri için geçerlidir, C # için değil
bytecode77

-3

Visual Studio 2012'de kullanmanız gerekir (Sanırım Visual Studio 2010'da da)

if $(Configuration) == Debug xcopy

$(ConfigurationName) bir makro olarak listelendi, ancak atanmadı.

Resim açıklamasını buraya girin

Karşılaştırma: Yapı Komutları ve Özellikleri için Makrolar


7
ConfigurationName kullanmak istiyorsunuz. Bu görüntü ... tüm bulanıklık ile anlaşılması gerçekten zor.
Gizli Rabbi
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.