Integrasi Visual Studio (MSBuild)
Visual Studio menghosting MSBuild untuk memuat dan membangun proyek terkelola. Karena MSBuild bertanggung jawab atas proyek, hampir semua proyek dalam format MSBuild dapat berhasil digunakan dalam Visual Studio, bahkan jika proyek ditulis oleh alat yang berbeda dan memiliki proses build yang disesuaikan.
Artikel ini menjelaskan aspek spesifik dari hosting MSBuild Visual Studio yang harus dipertimbangkan saat menyesuaikan proyek dan file .targets yang ingin Anda muat dan bangun di Visual Studio. Ini akan membantu Anda memastikan Visual Studio fitur seperti IntelliSense dan penelusuran kesalahan berfungsi untuk proyek kustom Anda.
Untuk informasi tentang proyek C++, lihat File proyek.
Ekstensi nama file proyek
MSBuild.exe mengenali ekstensi nama file proyek yang cocok dengan pola .*proj. Namun, Visual Studio hanya mengenali subset ekstensi nama file proyek ini, yang menentukan sistem proyek khusus bahasa yang akan memuat proyek. Visual Studio tidak memiliki sistem proyek berbasis MSBuild yang netral bahasa.
Misalnya, sistem proyek C# memuat file .csproj, tetapi Visual Studio tidak dapat memuat file .xxproj. File proyek untuk file sumber dalam bahasa arbitrer harus menggunakan ekstensi yang sama dengan file proyek Visual Basic atau C# untuk dimuat dalam Visual Studio.
Nama target terkenal
Mengklik perintah Build di Visual Studio akan menjalankan target default dalam proyek. Seringkali, target ini juga diberi nama Build
. Memilih perintah Bangun Ulang atau Bersihkan akan mencoba menjalankan target dengan nama yang sama dalam proyek. Mengklik Terbitkan akan menjalankan target bernama PublishOnly
dalam proyek.
Konfigurasi dan platform
Konfigurasi diwakili dalam proyek MSBuild menurut properti yang dikelompokkan dalam elemen PropertyGroup
yang berisi atribut Condition
. Visual Studio melihat kondisi ini untuk membuat daftar konfigurasi dan platform proyek untuk ditampilkan. Agar berhasil mengekstrak daftar ini, kondisi harus memiliki format yang mirip dengan berikut ini:
Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' "
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "
Visual Studio melihat kondisi pada properti PropertyGroup
, ItemGroup
, Import
, dan elemen item untuk tujuan ini.
Tindakan build tambahan
Visual Studio memungkinkan Anda mengubah nama jenis item file dalam proyek dengan properti Tindakan Build dari jendela Properti file. Nama jenis item Kompilasi, EmbeddedResource, Konten, dan Tidak Ada selalu tercantum dalam menu ini, bersama dengan nama jenis item lainnya yang sudah dalam proyek Anda. Untuk memastikan nama jenis item kustom selalu tersedia di menu ini, Anda dapat menambahkan nama ke jenis item bernama AvailableItemName
. Misalnya, menambahkan yang berikut ini ke file proyek Anda akan menambahkan jenis kustom JScript ke menu ini untuk semua proyek yang mengimpornya:
<ItemGroup>
<AvailableItemName Include="JScript"/>
</ItemGroup>
Menambahkan nama jenis item ke jenis item AvailableItemName
akan menyebabkan item dari jenis tersebut muncul di Penjelajah Solusi.
Catatan
Beberapa nama jenis item khusus untuk Visual Studio tetapi tidak tercantum dalam dropdown ini.
Pengkompilasi dalam proses
Jika memungkinkan, Visual Studio akan mencoba menggunakan versi dalam proses pengkompilasi Visual Basic untuk meningkatkan performa. (Tidak berlaku untuk C#.) Agar ini berfungsi dengan benar, kondisi berikut harus dipenuhi:
Dalam target proyek, harus ada tugas yang dinamai
Vbc
untuk proyek Visual Basic.Parameter
UseHostCompilerIfAvailable
dari tugas harus diatur ke benar.
IntelliSense waktu desain
Untuk mendapatkan dukungan IntelliSense di Visual Studio sebelum build menghasilkan perakitan output, kondisi berikut harus dipenuhi:
Harus ada target bernama
Compile
.Baik target
Compile
atau salah satu dependensinya harus memanggil tugas pengkompilasi untuk proyek, sepertiCsc
atauVbc
.Baik target
Compile
atau salah satu dependensinya harus menyebabkan pengkompilasi menerima semua parameter yang diperlukan untuk IntelliSense, terutama semua referensi.Kondisi yang tercantum di bagian Pengkompilasi dalam proses harus dipenuhi.
Membangun solusi
Dalam Visual Studio, file solusi dan pemesanan build proyek dikendalikan oleh Visual Studio itu sendiri. Saat membangun solusi dengan msbuild.exe pada baris perintah, MSBuild mengurai file solusi dan mengurutkan build proyek. Dalam kedua kasus, proyek dibangun secara individual dalam urutan dependensi, dan proyek ke referensi proyek tidak dilalui. Sebaliknya, ketika proyek individu dibangun dengan msbuild.exe, referensi proyek ke proyek dilalui.
Saat membangun di dalam Visual Studio, properti $(BuildingInsideVisualStudio)
diatur ke true
. Ini dapat digunakan dalam file proyek atau .targets Anda untuk menyebabkan build berakibat berbeda.
Menampilkan properti dan item
Visual Studio mengenali nama dan nilai properti tertentu. Misalnya, properti berikut dalam proyek akan menyebabkan Aplikasi Windows muncul dalam kotak Jenis Aplikasi di Perancang Proyek.
<OutputType>WinExe</OutputType>
Nilai properti dapat diedit di Perancang Proyek dan disimpan dalam file proyek. Jika properti tersebut diberi nilai yang tidak valid dengan pengeditan tangan, Visual Studio akan menampilkan peringatan saat proyek dimuat dan mengganti nilai yang tidak valid dengan nilai default.
Visual Studio memahami default untuk beberapa properti. Properti ini tidak akan dipertahankan ke dalam file proyek kecuali properti tersebut memiliki nilai non-default.
Properti dengan nama arbitrer tidak ditampilkan dalam Visual Studio. Untuk mengubah properti arbitrer di Visual Studio, Anda harus membuka file proyek di editor XML dan mengeditnya secara manual. Untuk informasi selengkapnya, lihat bagian Edit file proyek di Visual Studio nanti dalam topik ini.
Item yang ditentukan dalam proyek dengan nama jenis item arbitrer secara default ditampilkan dalam Penjelajah Solusi di bawah simpul proyek mereka. Untuk menyembunyikan item dari tampilan, atur metadata Visible
ke false
. Misalnya, item berikut akan berpartisipasi dalam proses build tetapi tidak ditampilkan dalam Penjelajah Solusi.
<ItemGroup>
<IntermediateFile Include="cache.temp">
<Visible>false</Visible>
</IntermediateFile>
</ItemGroup>
Catatan
Metadata Visible
diabaikan oleh Penjelajah Solusi untuk proyek C++. Item akan selalu ditampilkan meskipun Visible
diatur ke salah.
Item yang dideklarasikan dalam file yang diimpor ke dalam proyek tidak ditampilkan secara default. Item yang dibuat selama proses build tidak pernah ditampilkan dalam Penjelajah Solusi.
Kondisi pada item dan properti
Selama build, semua kondisi dihormati sepenuhnya.
Saat menentukan nilai properti untuk ditampilkan, properti yang Visual Studio pertimbangkan dependen konfigurasi dievaluasi secara berbeda dari properti yang dianggap independen konfigurasi. Untuk properti, ia menganggap konfigurasi tergantung, Visual Studio mengatur properti Configuration
dan Platform
dengan tepat dan menginstruksikan MSBuild untuk mengevaluasi kembali proyek. Untuk properti, ia menganggap konfigurasi independen, ini tidak menentukan bagaimana kondisi akan dievaluasi.
Ekspresi bersyarat pada item selalu diabaikan untuk tujuan memutuskan apakah item harus ditampilkan dalam Penjelajah Solusi.
Awakutu
Untuk menemukan dan meluncurkan perakitan output dan melampirkan debugger, Visual Studio memerlukan properti OutputPath
, AssemblyName
, dan OutputType
ditentukan dengan benar. Debugger akan gagal dilampirkan jika proses build tidak menyebabkan pengkompilasi menghasilkan file .pdb.
Eksekusi target waktu desain
Visual Studio mencoba mengeksekusi target dengan nama tertentu saat memuat proyek. Target ini mencakup Compile
, ResolveAssemblyReferences
, ResolveCOMReferences
, GetFrameworkPaths
, dan CopyRunEnvironmentFiles
. Visual Studio menjalankan target ini sehingga pengkompilasi dapat diinisialisasi untuk menyediakan IntelliSense, debugger dapat diinisialisasi, dan referensi yang ditampilkan dalam Penjelajah Solusi dapat diselesaikan. Jika target ini tidak ada, proyek akan memuat dan membangun dengan benar tetapi pengalaman waktu desain di Visual Studio tidak akan berfungsi penuh.
Mengedit file proyek di Visual Studio
Untuk mengedit proyek MSBuild secara langsung, Anda dapat membuka file proyek di editor XML Visual Studio.
Untuk membongkar dan mengedit file proyek di Visual Studio
Di Penjelajah Solusi, klik kanan pada simpul proyek, lalu pilih Bongkar Proyek.
Proyek ditandai (tidak tersedia).
Di Penjelajah Solusi, klik kanan pada simpul proyek yang tidak tersedia, lalu pilih Edit <File> Proyek.
File proyek terbuka di Editor XML Visual Studio.
Edit, simpan, lalu tutup file proyek.
Di Penjelajah Solusi, klik kanan simpul proyek yang tidak tersedia, lalu pilih Muat Ulang Proyek.
IntelliSense dan validasi
Saat menggunakan editor XML untuk mengedit file proyek, IntelliSense dan validasi didorong oleh file skema MSBuild. Ini diinstal dalam cache skema, yang dapat ditemukan di <Visual Studio instalasi directory>\Xml\Schemas\1033\MSBuild.
Jenis MSBuild inti ditentukan dalam Microsoft.Build.Core.xsd dan jenis umum yang digunakan oleh Visual Studio ditentukan dalam Microsoft.Build.CommonTypes.xsd. Untuk menyesuaikan skema sehingga Anda memiliki IntelliSense dan validasi untuk nama jenis item kustom, properti, dan tugas, Anda dapat mengedit Microsoft.Build.xsd, atau membuat skema Anda sendiri yang menyertakan skema CommonTypes atau Core. Jika Anda membuat skema Anda sendiri, Anda harus mengarahkan editor XML untuk menemukannya menggunakan jendela Properti.
Mengedit file proyek yang dimuat
Visual Studio cache konten file proyek dan file yang diimpor oleh file proyek. Jika Anda mengedit file proyek yang dimuat, Visual Studio akan secara otomatis meminta Anda untuk memuat ulang proyek sehingga perubahan diterapkan. Namun jika Anda mengedit file yang diimpor oleh proyek yang dimuat, tidak akan ada permintaan muat ulang dan Anda harus membongkar dan memuat ulang proyek secara manual untuk membuat perubahan diterapkan.
Grup output
Beberapa target yang ditentukan dalam Microsoft.Common.targets memiliki nama yang berakhiran OutputGroups
atau OutputGroupDependencies
. Visual Studio memanggil target ini untuk mendapatkan daftar output proyek tertentu. Misalnya, target SatelliteDllsProjectOutputGroup
membuat daftar semua rakitan satelit yang akan dibuat oleh build. Grup output ini digunakan oleh fitur seperti penerbitan, penyebaran, dan proyek ke referensi proyek. Proyek yang tidak menentukannya akan dimuat dan dibangun di Visual Studio, tetapi beberapa fitur mungkin tidak berfungsi dengan benar.
Resolusi referensi
Resolusi referensi adalah proses penggunaan item referensi yang disimpan dalam file proyek untuk menemukan rakitan aktual. Visual Studio harus memicu resolusi referensi untuk menampilkan properti terperinci untuk setiap referensi di jendela Properti. Daftar berikut ini menjelaskan tiga jenis referensi dan bagaimana referensi tersebut diselesaikan.
Referensi assembly:
Sistem proyek memanggil target dengan nama
ResolveAssemblyReferences
terkenal. Target ini harus menghasilkan item dengan jenis nama itemReferencePath
. Masing-masing item ini harus memiliki spesifikasi item (nilai atributInclude
dari item) yang berisi jalur lengkap ke referensi. Item harus memiliki semua metadata dari item input yang diteruskan selain metadata baru berikut:CopyLocal
, menunjukkan apakah assembly harus disalin ke dalam folder output, diatur ke benar atau salah.OriginalItemSpec
, berisi spesifikasi item asli dari referensi.ResolvedFrom
, atur ke "{TargetFrameworkDirectory}" jika diselesaikan dari direktori .NET Framework.
Referensi COM:
Sistem proyek memanggil target dengan nama
ResolveCOMReferences
terkenal. Target ini harus menghasilkan item dengan jenis nama itemComReferenceWrappers
. Masing-masing item ini harus memiliki spesifikasi item yang berisi jalur lengkap ke rakitan interop untuk referensi COM. Item harus memiliki semua metadata dari item input yang diteruskan, selain metadata baru dengan namaCopyLocal
, menunjukkan apakah rakitan harus disalin ke folder output, diatur ke benar atau salah.Referensi asli
Sistem proyek memanggil target dengan nama
ResolveNativeReferences
terkenal. Target ini harus menghasilkan item dengan jenis nama itemNativeReferenceFile
. Item harus memiliki semua metadata dari item input yang diteruskan, selain bagian baru metadata bernamaOriginalItemSpec
, yang berisi spesifikasi item asli referensi.
Pintasan performa
Jika Anda menggunakan IDE Visual Studio untuk memulai penelusuran kesalahan (baik dengan memilih kunci F5 atau dengan memilih Debug>Mulai Penelusuran Kesalahan pada bilah menu) atau untuk membangun proyek Anda (misalnya, Build>Solusi Build), proses build menggunakan pemeriksaan pembaruan cepat untuk meningkatkan performa. Dalam beberapa kasus di mana build yang disesuaikan membuat file yang dibangun secara bergiliran, pemeriksaan pembaruan cepat tidak mengidentifikasi file yang diubah dengan benar. Proyek yang membutuhkan pemeriksaan pembaruan yang lebih menyeluruh dapat menonaktifkan pemeriksaan cepat dengan mengatur variabel lingkungan DISABLEFASTUPTODATECHECK=1
. Atau, proyek dapat mengatur ini sebagai properti MSBuild dalam proyek atau dalam file yang diimpor proyek.