Cara menjalankan Visual Studio post-build events untuk debug build saja

592

Bagaimana saya bisa membatasi acara post-build saya hanya berjalan untuk satu jenis build?

Saya menggunakan peristiwa untuk menyalin file DLL ke direktori virtual IIS lokal, tapi saya tidak ingin ini terjadi pada server build dalam mode rilis.

JC.
sumber

Jawaban:

746

Acara Pra dan Pasca Bangun dijalankan sebagai skrip batch. Anda dapat melakukan pernyataan bersyarat pada $(ConfigurationName).

Contohnya

if $(ConfigurationName) == Debug xcopy something somewhere
Joseph Daigle
sumber
7
aneh, mungkin itu hanya saya tapi saya mencoba menambahkan kondisi if, dan sekarang saya mendapatkan kesalahan ini - kesalahan keluar dengan kode 255
Michael L
101
Saya telah menemukan bahwa seluruh perintah harus berada di satu baris atau Anda akan "keluar dengan kode 255"
Robin Minto
7
Anda juga dapat menggunakan gotos / label untuk solusi yang lebih lengkap (lihat jawaban saya 24 Juli)
CestLaGalere
11
dan Anda dapat menggunakan tanda kurung dengan perintah if (lihat jawaban saya untuk contoh)
gbjbaanb
1
Anda harus menggunakan "xcopy / Y", sehingga file tersebut akan ditimpa dalam direktori target.
Matthias
521

FYI, Anda tidak perlu menggunakan goto. Perintah shell IF dapat digunakan dengan kurung bulat:

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".
)
gbjbaanb
sumber
62
Bolehkah saya juga menambahkan, untuk berhati-hati dengan tanda kurung buka yang perlu segera mengikuti pernyataan if, seolah-olah itu di baris berikutnya kode kesalahan akan diproduksi
wonea
37
Gunakan "$(ConfigurationName)"(perhatikan tanda kutip) jika Anda mendapatkan kode kesalahan 255
jgauffin
20
perhatikan, jika Anda menggunakan "" sekitar $ (ConfigurationName), Anda juga perlu tanda kutip di sekitar kata Debug - perintah perintah IF IF sangat .. literal ... ketika datang ke perbandingan string.
gbjbaanb
5
Catatan, Untuk menghilangkan 255, saya harus menggunakan "" sekitar $ (ConfigurationName) DAN menghapus spasi di sekitar kondisi, misalnya jika "$ (ConfigurationName)" == "Rilis" <- Tanpa spasi sekitar ==
fhilton
15
Dalam kasus saya dengan Visual Studio 2017 $(ConfigurationName)kosong (baris perintah acara Post-build). if "$(Configuration)" == "Debug"bekerja untukku. BTW, jika Anda ingin melakukan sesuatu di semua konfigurasi lain, gunakan if NOT "$(Configuration)" == "Debug".
Ralf Hundewadt
125

Tambahkan acara pembuatan pos Anda seperti biasa. Kemudian simpan proyek Anda, buka di Notepad (atau editor favorit Anda), dan tambahkan kondisi ke grup properti PostBuildEvent. Ini sebuah contoh:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>
Franci Penov
sumber
5
Ini berfungsi tetapi memaksa Anda melakukan semua pekerjaan desain Anda untuk acara di sumber file proyek. Deklarasi acara build bersyarat lainnya juga disembunyikan dari IDE.
Joseph Daigle
3
Saya harus mengatakan ini adalah jawaban yang lebih baik bagi saya, metode yang disukai tidak bekerja.
Michael L
8
Anda tidak perlu membukanya di Notepad, Anda bisa tinggal di Visual Studio. Anda dapat mengklik kanan file proyek, klik "Bongkar proyek", lalu klik kanan lagi dan klik "Edit". Anda sekarang dapat mengedit file {{csproj}} dengan pewarnaan sintaks. Klik kanan lagi, tapi sekarang klik "Muat ulang proyek" untuk memuat ulang.
Abel
1
Pendekatan ini tidak memperluas makro dalam perintah PostBuildEvent sendiri ketika saya mencobanya. cd "$(ProjectDir)"diperluas ke cd "".
Darryl
3
Di VS 2017 Anda juga bisa melakukan ini <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>. Variabel makro dan semuanya berfungsi seperti biasa.
SC
106

Atau (karena acara dimasukkan ke file batch dan kemudian dipanggil), gunakan yang berikut ini (di kotak Bangun acara, bukan dalam file batch):

if $(ConfigurationName) == Debug goto :debug

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

goto :exit

:debug
' Debug items in here

:exit

Dengan cara ini Anda dapat memiliki acara untuk konfigurasi apapun, dan masih mengelolanya dengan macro daripada harus melewati mereka ke dalam sebuah file batch, ingat bahwa %1adalah $(OutputPath), dll

CestLaGalere
sumber
6
Jika Anda mendapatkan kesempatan untuk melihat beberapa kode Anda di reflektor, kompiler mengubah banyak pernyataan switch / case menjadi goto's.
StingyJack
10
Kebanyakan kompiler melakukan menerjemahkan kode menjadi instruksi yang lebih sederhana, seperti goto. Dan reverse engineering tidak bisa menyatukan instruksi yang lebih sederhana ke dalam instruksi "bagus" yang lebih rumit yang lebih Anda sukai. Saya tidak melihat bagaimana Microsoft memaksa kami untuk menggunakan goto, atau bagaimana ini relevan dengan posting ini.
TamusJRoyce
1
@ StingyJack: jika Anda melihat kode yang dikompilasi, Anda akan melihat semua itu berubah menjadi instruksi JMP :) Saya tidak peduli apa yang dilakukan kompiler di balik selimut, selama saya bisa menulis kode yang mudah dibaca. (bukan berarti menggunakan goto tidak sesekali sangat mudah dibaca)
gbjbaanb
Jika saya menempatkan perintah post-build saya di dalam batch saya mendapatkan pesan kesalahan ini ketika tekan build:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Sebastian
4
jika mau, Anda dapat menghapus ifdan menggunakangoto :$(ConfigurationName)
Calimero100582
15

Visual Studio 2015: Sintaks yang benar adalah (tetap di satu baris):

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

Tidak ada kesalahan 255 di sini.

Eric Bole-Feysot
sumber
3
pertahankan satu jalur
Eric Bole-Feysot
Bekerja dengan baik. Tks
Vinicius Gonçalves
1
Teknik kondisional Anda bekerja paling baik untuk saya. Namun, ini bekerja lebih baik tanpa persyaratan sama sekali dan jauh lebih ringkas. salin "$ (ProjectDir) \ .. \ $ (ConfigurationName) \ MyFileName" "$ (TargetDir)"
shawn1874
1
Skrip Anda benar, tetapi skrip saya memungkinkan untuk menyalin file yang berbeda untuk konfigurasi yang berbeda.
Eric Bole-Feysot
8

Pada Visual Studio 2019, .csprojformat modern mendukung penambahan kondisi langsung pada Targetelemen:

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

UI tidak menyediakan cara untuk mengatur ini, tetapi tampaknya aman meninggalkan Configurationatribut di tempat jika Anda membuat perubahan melalui UI.

Daniel Earwicker
sumber
Ini bekerja untuk saya di VS 2019, terima kasih!
BrandoTheBrave
Ini benar-benar layak untuk menjadi lebih tinggi, mereka juga harus benar-benar memperbarui UI untuk memungkinkan Anda menandai Konfigurasi Bangun atau setidaknya menambahkan Ketentuan dari properti csproj.
DeadlyChambers
4

Anda dapat meneruskan nama konfigurasi ke skrip post-build dan memeriksanya di sana untuk melihat apakah harus dijalankan.

Lulus nama konfigurasi dengan $(ConfigurationName).

Memeriksa itu didasarkan pada bagaimana Anda menerapkan langkah post-build - itu akan menjadi argumen baris perintah.

Lou Franco
sumber
-1

Ini berfungsi untuk saya di Visual Studio 2015.

Saya menyalin semua file DLL dari folder yang terletak di folder perpustakaan pada tingkat yang sama dengan folder solusi saya ke direktori target proyek yang sedang dibangun.

Menggunakan jalur relatif dari direktori proyek saya dan naik struktur folder dua langkah dengan .. \ .. \ lib

MySolutionFolder
.... MyProject
Lib

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

Seperti pengaturan proyek apa pun, buildevents dapat dikonfigurasikan per Konfigurasi. Cukup pilih konfigurasi yang ingin Anda ubah dalam dropdown dialog Halaman Properti dan edit langkah pembuatan posting.

Harald Scheirich
sumber
10
Bangun Acara tidak spesifik untuk konfigurasi apa pun ketika dibuat di IDE.
Joseph Daigle
1
Tidak bekerja di VS2015. Tidak dapat dikonfigurasi per konfigurasi.
willem
2
Ini hanya berlaku untuk proyek C ++ di Visual Studio, bukan C #
bytecode77
-3

Di Visual Studio 2012 Anda harus menggunakan (saya pikir di Visual Studio 2010 juga)

if $(Configuration) == Debug xcopy

$(ConfigurationName) terdaftar sebagai makro, tetapi tidak ditugaskan.

Masukkan deskripsi gambar di sini

Bandingkan: Makro untuk Membangun Perintah dan Properti

mawl
sumber
7
Anda ingin menggunakan ConfigurationName. Gambar ini ... sangat sulit dimengerti dengan semua blur.
Stealth Rabbi