Memperluas proses pembuatan dengan MSBuild

Tujuan artikel ini adalah untuk memberi tahu sedikit tentang MSBuild, menunjukkan target dan tugas apa yang ada di MSBuild, mempelajari cara bekerja dengan file .csproj, dan menyediakan tautan yang bermanfaat. Jika Anda memiliki judul yang lebih cocok untuk artikel tersebut, saya akan senang untuk membahasnya di komentar.

Menu



Konsep dasar ( Menu )


MSBuild dirancang sedemikian rupa sehingga perakitan proyek dibagi menjadi beberapa tahap.

Target adalah tahap tertentu (peristiwa) yang terjadi selama perakitan proyek. Anda dapat menggunakan target standar, atau menentukan target Anda sendiri.

Tugas adalah tugas yang dapat dilakukan pada tahap tertentu. Anda dapat menggunakan tugas standar atau membuat tugas Anda sendiri.

Kutipan dari dokumentasi tentang penargetan ( https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-targets ):
Targetkan tugas-tugas kelompok bersama dalam urutan tertentu dan memungkinkan proses pembangunan diperhitungkan dalam unit yang lebih kecil.
Misalnya, satu target dapat menghapus semua file di direktori output untuk mempersiapkan build, sementara yang lain
mengkompilasi input untuk proyek dan menempatkannya di direktori kosong.

Siklus Hidup MSBuild Build ( Menu )


Untuk MSBuild, Microsoft telah menetapkan sejumlah target standar (dalam file Microsoft.Common.targets, Microsoft.CSharp.targets, dll.). Sejumlah besar target berbeda didefinisikan, tetapi dalam artikel ini kami tidak akan membahas ini secara rinci. Beberapa target standar (dipesan):

Daftar Target (Spoiler)
  • Beforerebuild
  • Bersih
  • Beforebuild
  • BuildOnlySettings
  • Siapkan ForBuild
  • PreBuildEvent
  • Selesaikan Referensi
  • Mempersiapkan Sumber
  • ResolveKeySource
  • Kompilasi
  • Pendaftaran Tidak dikelola
  • HasilkanSerialisasiAssemblies
  • BuatSatellite Satelit
  • Hasilkan Manifest
  • GetTargetPath
  • Siapkan ForRun
  • Pendaftaran tidak dikelola
  • Bersihkan bersih
  • PostBuildEvent
  • Afterbuild
  • Bangun kembali


Target BeforeBuild dan AfterBuild dirancang khusus untuk diganti dan dapat digunakan. Saya tidak merekomendasikan menggunakan target yang tersisa dari daftar sehingga tidak ada yang rusak .

Untuk tampilan daftar target yang lebih rinci, Anda dapat menggunakan opsi / pp:. Berkat parameter ini, sebuah file akan dihasilkan di mana semua impor akan disertakan (termasuk file .targets). Anda dapat menemukan banyak target dan variabel di dalamnya (terima kasih aikixd untuk tipnya).


Mempersiapkan lingkungan sebagai contoh ( Menu )


Sebagai contoh, Anda perlu:

  • Visual Studio Lingkungan Pengembangan Terpasang
  • Buat proyek jenis Aplikasi Konsol bernama MSBuildExample
  • Buka folder proyek dan temukan file MSBuildExample.csproj di sana
  • Buka file MSBuildExample.csproj di notepad atau editor lain

Dalam semua contoh di artikel ini, Anda perlu mengedit file MSBuildExample.csproj. Setiap contoh melibatkan menghapus kode dari contoh sebelumnya dan menambahkan yang baru. Kode harus ditambahkan di akhir file .csproj ke baris terakhir yang berisi tag Proyek penutup.

gambar

Perhatian! Dalam file .csproj, kasus penting .
Untuk menjalankan contoh, Anda harus menjalankan build di lingkungan pengembangan Visual Studio. Untuk beberapa contoh, Anda harus memilih konfigurasi solusi.

gambar

Hasilnya akan ditampilkan di jendela Output di Visual Studio (bawah). Jika tidak, buka melalui item menu View => Output.

gambar


Menargetkan dalam MSBuild ( Menu )


Sebagai contoh, kami akan menggunakan tugas Pesan , yang akan menampilkan informasi di jendela Output di Visual Studio. Seperti yang disebutkan sebelumnya, ada target standar BeforeBuild dan AfterBuild, kami akan menggunakannya. Untuk pelatihan, bacalah bagian Mempersiapkan lingkungan sebagai contoh .

Contoh penggunaan target (spoiler)
Kode contoh:

<Target Name="AfterBuild"> <Message Text="AfterBuild event" Importance="high"></Message> </Target> <Target Name="BeforeBuild"> <Message Text="BeforeBuild event" Importance="high"></Message> </Target> 

Hasil eksekusi (tidak perlu dikecualikan):
...
Beforebuild acara
...
Acara afterbuild
...


Seperti yang Anda lihat, pesan tugas dieksekusi, yang menampilkan teks yang kami tentukan pada saat BeforeBuild dan AfterBuild di jendela Output di Visual Studio.
Ketika mendefinisikan target dengan nama yang sama, itu ditimpa!

Contoh penulisan ulang target (spoiler)
Kode contoh:

 <Target Name="BeforeBuild"> <Message Text="First message" Importance="high"></Message> </Target> <Target Name="BeforeBuild"> <Message Text="Second message" Importance="high"></Message> </Target> 

Hasil eksekusi (tidak perlu dikecualikan):
...
Pesan kedua
...


Hanya pesan kedua yang ditampilkan, karena mereka menggunakan target dengan nama yang sama dan ditimpa oleh nilai kedua.

Membuat Target MSBuild Anda Sendiri ( Menu )


Jika target BeforeBuild dan AfterBuild tidak cukup atau Anda ingin tugas dieksekusi pada tahap lain dari siklus hidup perakitan, Anda dapat menentukan target Anda sendiri. Untuk tujuan ini, ada parameter Sebelum Target dan AfterTarget.

Contoh mendefinisikan target Anda sendiri (spoiler)
Kode contoh:

  <Target Name="BeforeBuild"> <Message Text="BeforeBuild event" Importance="high"></Message> </Target> <Target Name="MyCustomBeforeTarget" BeforeTargets="BeforeBuild"> <Message Text="MyCustomBeforeTarget event" Importance="high"></Message> </Target> <Target Name="MyCustomAfterTarget" AfterTargets="BeforeBuild"> <Message Text="MyCustomAfterTarget event" Importance="high"></Message> </Target> 

Hasil eksekusi (tidak perlu dikecualikan):
...
Acara MyCustomBeforeTarget
Beforebuild acara
Acara MyCustomAfterTarget
...


Dua target khusus ditentukan - MyCustomBeforeTarget dan MyCustomAfterTarget.
Target MyCustomBeforeTarget dijalankan sebelum target BeforeBuild karena kami menetapkan:

 BeforeTargets="BeforeBuild" 

Target MyCustomAfterTarget dijalankan setelah target BeforeBuild karena kami menetapkan:

 AfterTargets="BeforeBuild" 

Tugas di MSBuild ( Menu )


Artikel ini tidak membahas bagaimana Anda dapat menulis tugas Anda sendiri, tetapi sebelum Anda menulis tugas, periksa daftar tugas yang disediakan oleh Microsoft .

Mari kita lihat beberapa contoh penggunaan tugas dan makro.

Parameter kondisi (spoiler)
Parameter Kondisi hadir di semua tugas. Kutipan dari dokumentasi docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-task-reference :
Ekspresi Boolean yang digunakan mesin MSBuild untuk menentukan apakah tugas ini akan dieksekusi.
Kode contoh:

 <Target Name="BeforeBuild"> <Message Text="Current configuration is Debug" Condition="'$(Configuration)' == 'Debug'" Importance="high"></Message> <Message Text="Current configuration is Release" Condition="'$(Configuration)' == 'Release'" Importance="high"></Message> </Target> 

Jika solusi konfigurasi Debug dipilih, hasilnya akan terlihat seperti ini (tidak perlu dikecualikan):
...
Konfigurasi saat ini adalah Debug
...
Jika Rilis konfigurasi solusi dipilih, hasilnya akan terlihat seperti ini (tidak perlu dikecualikan):
...
Konfigurasi saat ini adalah Release
...
Anda dapat menemukan informasi tentang makro $ (Konfigurasi) dan makro lainnya di bagian variabel dan makro di .csproj .

Informasi tentang sintaksis kondisi dapat ditemukan di sana https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-conditions

Definisi variabel dalam csproj (spoiler)
Dalam contoh di atas, kami memiliki teks yang dapat disatukan. Untuk menghindari duplikasi, kami akan menempatkan teks pesan dalam variabel terpisah.

Kode contoh:

 <PropertyGroup> <MessageText>Current configuration is $(Configuration)</MessageText> </PropertyGroup> <Target Name="BeforeBuild"> <Message Text="$(MessageText)" Condition="'$(Configuration)' == 'Debug'" Importance="high"></Message> <Message Text="$(MessageText)" Condition="'$(Configuration)' == 'Release'" Importance="high"></Message> </Target> 

Untuk menentukan variabel Anda sendiri, gunakan elemen PropertyGroup .


Memeriksa keberadaan file, mengeluarkan kesalahan (spoiler)
Dalam contoh ini, kami membuat tugas yang memeriksa apakah file App.Debug.config telah dibuat. Jika tidak dibuat, maka kami melempar kesalahan. Jika terjadi kesalahan, build akan dihentikan dan kesalahan akan ditampilkan sebagai kesalahan kompilasi di jendela Daftar Kesalahan.
Kami menggunakan tugas Kesalahan dan parameter kondisi yang sudah akrab bagi kami.

Kode contoh:

 <Target Name="BeforeBuild"> <Error Condition="!Exists('App.Debug.config')" Text="File App.Debug.config not found"></Error> </Target> 

Hasil:
gambar

Klausa yang ada menggunakan jalur relatif dari folder di mana file .csproj berada. Untuk mengakses folder di atas yang sekarang gunakan '../'. Jika Anda perlu mengakses subfolder, maka gunakan format '[DirectoryName] /App.Debug.config'.

Menyalin file (spoiler)
Dalam contoh ini, kita akan menggunakan tugas Salin . Dengan menggunakan tugas tersebut, salin file App.config ke folder bin / [Configuration] / Config ke dua file App.config dan App.test.config.

Kode contoh:

 <Target Name="BeforeBuild"> <Copy SourceFiles="App.config;App.config" DestinationFiles="$(OutputPath)/Test/App.config;$(OutputPath)/Test/App.test.config"></Copy> </Target> 

Properti SourceFiles adalah array file yang akan diunduh. Tunjukkan tanpa tanda kutip, dipisahkan dengan tanda titik koma.

Properti DestinationFiles adalah array file tempat file akan disalin. Tunjukkan tanpa tanda kutip, dipisahkan dengan tanda titik koma.

Baca lebih lanjut tentang makro $ (OutputPath) di bagian Variabel dan Makro di .csproj .

Variabel dan makro di .csproj ( Menu )


Sejumlah makro standar dapat digunakan dalam file .csproj, daftar mereka dapat ditemukan di sini https://msdn.microsoft.com/en-us/library/c02as0cs.aspx dan di sini https://msdn.microsoft.com/en-us/ library / bb629394.aspx . Pertimbangkan beberapa makro berguna:

  • $ (MSBuildToolsPath) - menunjukkan jalur ke folder MSBuild. Sebagai contoh, C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin. Saat menggabungkan jalur, gunakan makro ini dengan garis miring. Misalnya, $ (MSBuildToolsPath) \ Microsoft.Web.Publishing.Tasks.dll. Kalau tidak, itu bisa salah membentuk jalur dan memberikan kesalahan bahwa file tidak ditemukan.
  • $ (OutputPath) - jalur relatif ke folder output. Sebagai contoh, bin \ Stage. Gunakan makro ini dengan garis miring, misalnya, $ (OutputPath) \ $ (TargetFileName) .config.
  • $ (TargetFileName) - nama file output dengan ekstensi. Misalnya, MSBuildExample.exe. Ekstensi dan format nama file output mungkin berbeda dari berbagai jenis proyek. Dengan menggunakan makro ini, Anda dapat dengan aman menentukan nama file konfigurasi nantinya. Ini mungkin berguna untuk transformasi konfigurasi.
  • $ (Konfigurasi) adalah nama konfigurasi saat ini. Misalnya, Lepaskan, Debug
  • $ (IntermediateOutputPath) - path ke folder obj. Misalnya, obj \ Stage.

Untuk menentukan parameter Anda sendiri, gunakan PropertyGroup . Contoh mendefinisikan variabel Anda sendiri dapat ditemukan di bagian tugas di MSBuild .

Tautan ( Menu )


Source: https://habr.com/ru/post/id414969/


All Articles