Memutakhirkan Proyek

Perubahan pada model proyek dari satu versi Visual Studio ke versi berikutnya mungkin mengharuskan proyek dan solusi ditingkatkan sehingga dapat berjalan pada versi yang lebih baru. Visual Studio SDK menyediakan antarmuka yang dapat digunakan untuk menerapkan dukungan peningkatan di proyek Anda sendiri.

Memutakhirkan Strategi

Untuk mendukung peningkatan, implementasi sistem proyek Anda harus menentukan dan menerapkan strategi peningkatan. Dalam menentukan strategi, Anda dapat memilih untuk mendukung cadangan berdampingan (SxS), cadangan salinan, atau keduanya.

  • Pencadangan SxS berarti bahwa proyek hanya menyalin file-file yang perlu ditingkatkan, menambahkan akhiran nama file yang sesuai, misalnya, ".old".

  • Salin cadangan berarti bahwa proyek menyalin semua item proyek ke lokasi cadangan yang disediakan pengguna. File yang relevan di lokasi proyek asli kemudian diperbarui.

Cara Kerja Upgrade

Saat solusi yang dibuat di versi Visual Studio yang lebih lama dibuka dalam versi yang lebih baru, IDE memeriksa file solusi untuk menentukan apakah perlu ditingkatkan. Jika peningkatan diperlukan, Wizard Peningkatan secara otomatis diluncurkan untuk memandu pengguna melalui proses peningkatan.

Ketika solusi perlu ditingkatkan, solusi tersebut menanyakan strategi peningkatan kepada setiap fasilitas proyek. Strategi ini menentukan apakah pabrik proyek mendukung pencadangan salinan atau cadangan SxS. Informasi dikirim ke Panduan Peningkatan, yang mengumpulkan informasi yang diperlukan untuk cadangan dan menyajikan opsi yang berlaku kepada pengguna.

Solusi Multi-Proyek

Jika solusi berisi beberapa proyek dan strategi peningkatan berbeda, seperti ketika proyek C++ yang hanya mendukung pencadangan SxS dan proyek Web yang hanya mendukung cadangan salinan, pabrik proyek harus menegosiasikan strategi peningkatan.

Solusi ini mengajukan permintaan ke setiap pabrik proyek untuk IVsProjectUpgradeViaFactory. Kemudian memanggil UpgradeProject_CheckOnly untuk melihat apakah file proyek global perlu ditingkatkan dan untuk menentukan strategi peningkatan yang didukung. Wizard Peningkatan diaktifkan kemudian.

Setelah pengguna menyelesaikan wizard, UpgradeProject dipanggil pada setiap pabrik proyek untuk melakukan peningkatan aktual. Untuk memfasilitasi pencadangan, metode IVsProjectUpgradeViaFactory menyediakan layanan SVsUpgradeLogger untuk melakukan logging detail proses pemutakhiran. Layanan ini tidak dapat di-cache.

Setelah memperbarui semua file global yang relevan, setiap pabrik proyek dapat memilih untuk membuat instans proyek. Implementasi proyek harus mendukung IVsProjectUpgrade. Metode UpgradeProject ini kemudian dipanggil untuk meningkatkan semua item proyek yang relevan.

Nota

Metode UpgradeProject ini tidak menyediakan layanan SVsUpgradeLogger. Layanan ini dapat diperoleh dengan memanggil QueryService.

Praktik Terbaik

SVsQueryEditQuerySave Gunakan layanan untuk memeriksa apakah Anda dapat mengedit file sebelum mengeditnya, dan dapat menyimpannya sebelum menyimpannya. Ini akan membantu implementasi pencadangan dan peningkatan Anda menangani file proyek di bawah kontrol sumber, file dengan izin yang tidak mencukup, dan sebagainya.

SVsUpgradeLogger Gunakan layanan selama semua fase pencadangan dan peningkatan untuk memberikan informasi tentang keberhasilan atau kegagalan proses peningkatan.

Untuk informasi lebih lanjut tentang membuat cadangan dan meningkatkan proyek, merujuklah pada komentar untuk IVsProjectUpgrade di vsshell2.idl.

Meningkatkan Proyek Kustom

Jika Anda mengubah informasi yang disimpan dalam file proyek antara versi Visual Studio yang berbeda dari produk Anda, maka Anda perlu mendukung peningkatan file proyek dari versi lama ke versi baru. Untuk mendukung peningkatan yang memungkinkan Anda berpartisipasi dalam Wizard Konversi Visual Studio, terapkan antarmuka IVsProjectUpgradeViaFactory. Antarmuka ini berisi satu-satunya mekanisme yang tersedia untuk peningkatan salinan. Peningkatan proyek dilakukan saat bagian dari solusi dibuka. Antarmuka IVsProjectUpgradeViaFactory diimplementasikan oleh pabrik proyek, atau setidaknya harus dapat diperoleh dari pabrik proyek.

Mekanisme lama yang menggunakan IVsProjectUpgrade antarmuka masih didukung, tetapi secara konseptual meningkatkan sistem proyek sebagai bagian dari proyek terbuka. Oleh karena itu IVsProjectUpgrade antarmuka dipanggil oleh lingkungan Visual Studio meskipun IVsProjectUpgradeViaFactory antarmuka dipanggil atau diimplementasikan. Pendekatan ini memungkinkan Anda untuk menggunakan IVsProjectUpgradeViaFactory untuk mengimplementasikan penyalinan serta memproyeksikan hanya sebagian dari peningkatan, dan mendelegasikan sisa pekerjaan untuk dilakukan secara langsung (mungkin di lokasi baru) oleh antarmuka IVsProjectUpgrade.

Untuk contoh implementasi IVsProjectUpgrade, lihat Sampel VSSDK.

Skenario berikut muncul dengan peningkatan proyek:

  • Jika file memiliki format yang lebih baru dari yang dapat didukung proyek, maka file harus mengembalikan kesalahan yang menyatakan ini. Ini mengasumsikan bahwa versi lama produk Anda menyertakan kode untuk memeriksa versi.

  • Jika parameter flag ditentukan dalam metode, upgrade akan diimplementasikan sebagai upgrade di tempat sebelum pembukaan proyek.

  • Jika PUVFF_COPYBACKUP flag ditentukan pada UpgradeProject metode, peningkatan diimplementasikan sebagai upgrade salinan.

  • Jika UPF_SILENTMIGRATE flag ditentukan dalam UpgradeProject panggilan, maka pengguna diminta oleh lingkungan untuk memperbarui berkas proyek sebagai in-place upgrade, setelah proyek dibuka. Misalnya, lingkungan meminta pengguna untuk meningkatkan saat pengguna membuka versi solusi yang lebih lama.

  • Jika "flag" UPF_SILENTMIGRATE tidak ditentukan dalam panggilan UpgradeProject, maka Anda harus meminta pengguna untuk meningkatkan file proyek.

    Berikut ini adalah contoh pesan perintah peningkatan:

    "Proyek '%1' dibuat dengan versi Visual Studio yang lebih lama. Jika Anda membukanya dengan versi Visual Studio ini, Anda mungkin tidak dapat membukanya dengan versi Visual Studio yang lebih lama. Anda ingin melanjutkan dan membuka proyek ini?"

Untuk mengimplementasikan IVsProjectUpgradeViaFactory

  1. Terapkan metode antarmuka IVsProjectUpgradeViaFactory, khususnya metode UpgradeProject dalam implementasi pabrik proyek Anda, atau pastikan implementasi tersebut dapat dipanggil dari implementasi pabrik proyek Anda.

  2. Jika Anda ingin melakukan upgrade in-place sebagai bagian dari proses membuka solusi, gunakan flag PUVFF_SXSBACKUP sebagai parameter VSPUVF_FLAGS dalam implementasi UpgradeProject Anda.

  3. Jika Anda ingin melakukan upgrade di tempat sebagai bagian dari pembukaan solusi itu, berikan flag PUVFF_COPYBACKUP sebagai parameter VSPUVF_FLAGS dalam implementasi Anda UpgradeProject.

  4. Untuk langkah 2 dan 3, langkah-langkah peningkatan file aktual, menggunakan IVsQueryEditQuerySave2, dapat diimplementasikan seperti yang dijelaskan di bagian "Menerapkan IVsProjectUpgade" di bawah ini, atau Anda dapat mendelegasikan peningkatan file aktual ke IVsProjectUpgrade.

  5. Gunakan metode IVsUpgradeLogger untuk memposting pesan terkait peningkatan untuk pengguna menggunakan Wizard Migrasi Visual Studio.

  6. IVsFileUpgrade antarmuka digunakan untuk mengimplementasikan segala jenis peningkatan file yang perlu terjadi sebagai bagian dari peningkatan proyek. Antarmuka ini tidak dipanggil dari IVsProjectUpgradeViaFactory, tetapi disediakan sebagai mekanisme untuk meningkatkan file yang merupakan bagian dari sistem proyek, tetapi sistem proyek utama mungkin tidak diketahui secara langsung. Misalnya, situasi ini dapat muncul jika file dan properti terkait pengompilasi tidak ditangani oleh tim pengembangan yang sama yang menangani sisa sistem proyek.

Implementasi IVsProjectUpgrade

Jika sistem proyek Anda hanya menerapkan IVsProjectUpgrade , sistem tersebut tidak dapat berpartisipasi dalam Wizard Konversi Visual Studio. Namun, bahkan jika Anda menerapkan IVsProjectUpgradeViaFactory antarmuka, Anda masih dapat mendelegasikan peningkatan file ke IVsProjectUpgrade implementasi.

Untuk mengimplementasikan IVsProjectUpgrade

  1. Ketika pengguna mencoba membuka proyek, UpgradeProject metode dipanggil oleh lingkungan setelah proyek dibuka dan sebelum tindakan pengguna lain dapat diambil pada proyek. Jika pengguna telah diminta untuk meningkatkan solusi, maka UPF_SILENTMIGRATE penanda diteruskan dalam grfUpgradeFlags parameter. Jika pengguna membuka proyek secara langsung, seperti dengan menggunakan perintah Tambahkan Proyek yang Ada, maka parameter UPF_SILENTMIGRATE tidak diteruskan dan proyek perlu meminta pengguna untuk meningkatkan.

  2. Sebagai tanggapan atas panggilan UpgradeProject, proyek harus mengevaluasi apakah file proyek harus ditingkatkan. Jika proyek tidak perlu meningkatkan jenis proyek ke versi baru, maka proyek hanya dapat mengembalikan S_OK bendera.

  3. Jika proyek perlu meningkatkan jenis proyek ke versi baru, maka proyek harus menentukan apakah file proyek dapat dimodifikasi dengan memanggil QueryEditFiles metode dan meneruskan nilai tagVSQueryEditFlags untuk rgfQueryEdit parameter . Proyek kemudian perlu melakukan hal berikut:

  4. QueryEditFiles Jika panggilan pada file proyek menyebabkan file dicek keluar, dan versi terbaru diambil, maka proyek dibongkar dan dimuat ulang. Metode UpgradeProject ini dipanggil lagi setelah instans proyek lain dibuat. Pada panggilan kedua ini, file proyek dapat ditulis ke disk; disarankan agar proyek menyimpan salinan file proyek dalam format sebelumnya dengan . Ekstensi LAMA, buat perubahan peningkatan yang diperlukan, dan simpan file proyek dalam format baru. Sekali lagi, jika ada bagian dari proses peningkatan yang gagal, metode harus menunjukkan kegagalan dengan mengembalikan VS_E_PROJECTMIGRATIONFAILED. Ini menyebabkan proyek di-unload di Solution Explorer.

    Penting untuk memahami proses lengkap yang terjadi di lingkungan untuk kasus di mana panggilan ke metode QueryEditFiles yang menentukan nilai ReportOnly mengembalikan QER_EditNotOK dan QER_ReadOnlyUnderScc bendera.

  5. Pengguna mencoba membuka file proyek.

  6. Lingkungan memanggil implementasi Anda CanCreateProject .

  7. Jika CanCreateProject mengembalikan true, maka lingkungan memanggil implementasi Anda CanCreateProject .

  8. Lingkungan memanggil implementasi Anda Load untuk membuka file dan menginisialisasi objek proyek, misalnya, Project1.

  9. Lingkungan memanggil implementasi Anda IVsProjectUpgrade::UpgradeProject untuk menentukan apakah file proyek perlu ditingkatkan.

  10. Anda memanggil QueryEditFiles dan meneruskan nilai QEF_ReportOnly untuk parameter rgfQueryEdit.

  11. Lingkungan mengembalikan QER_EditNotOK untuk VSQueryEditResult dan QER_ReadOnlyUnderScc bit disetel dalam VSQueryEditResultFlags.

  12. Implementasi IVsProjectUpgrade Anda melakukan panggilan IVsQueryEditQuerySave::QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits).

Panggilan ini dapat menyebabkan salinan baru file proyek Anda diambil dan versi terbaru diambil, serta memerlukan pemuatan ulang file proyek Anda. Pada titik ini, salah satu dari dua hal terjadi:

  • Jika Anda menangani pemrosesan ulang proyek Anda sendiri, lingkungan akan memanggil implementasi ReloadItem (VSITEMID_ROOT) Anda. Saat Anda menerima panggilan ini, muat ulang instans pertama proyek Anda (Project1) dan lanjutkan peningkatan file proyek Anda. Lingkungan mengetahui bahwa Anda menangani pemuatan ulang proyek Anda sendiri jika Anda mengembalikan true untuk GetProperty (VSHPROPID_HandlesOwnReload).

  • Jika Anda tidak menangani pemuat ulang proyek Anda sendiri, maka Anda mengembalikan false untuk GetProperty (VSHPROPID_HandlesOwnReload). Dalam hal ini, sebelum QueryEditFiles(QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits) kembali, lingkungan membuat instans baru lain dari proyek Anda, misalnya, Project2, sebagai berikut:

    1. Lingkungan memanggil Close objek proyek pertama Anda, Project1, sehingga menempatkan objek ini dalam status tidak aktif.

    2. Lingkungan memanggil implementasi Anda IVsProjectFactory::CreateProject untuk membuat instans kedua proyek Anda, Project2.

    3. Lingkungan memanggil implementasi Anda IPersistFileFormat::Load untuk membuka file dan menginisialisasi objek proyek kedua, Project2.

    4. Lingkungan memanggil IVsProjectUpgrade::UpgradeProject untuk kedua kalinya untuk menentukan apakah objek proyek harus ditingkatkan. Namun, panggilan ini dilakukan pada instans proyek baru, kedua, Project2. Ini adalah proyek yang dibuka dalam solusi.

      Nota

      Dalam hal proyek pertama Anda, Project1, ditempatkan dalam status tidak aktif, maka Anda harus mengembalikan S_OK dari panggilan pertama ke implementasi UpgradeProject Anda.

    5. Anda memanggil QueryEditFiles dan meneruskan nilai QEF_ReportOnly untuk parameter rgfQueryEdit.

    6. Lingkungan memberikan respons QER_EditOK dan peningkatan bisa dilanjutkan karena file proyek dapat ditulis.

Jika Anda gagal meningkatkan, kembalikan VS_E_PROJECTMIGRATIONFAILED dari IVsProjectUpgrade::UpgradeProject. Jika tidak ada peningkatan yang diperlukan atau Anda memilih untuk tidak meningkatkan, perlakukan panggilan IVsProjectUpgrade::UpgradeProject sebagai no-op. Jika Anda mengembalikan VS_E_PROJECTMIGRATIONFAILED, simpul placeholder ditambahkan ke solusi untuk proyek Anda.

Memutakhirkan Item Proyek

Jika Anda menambahkan atau mengelola item di dalam sistem proyek yang tidak Anda terapkan, Anda mungkin perlu berpartisipasi dalam proses peningkatan proyek. Laporan Kristal adalah contoh item yang dapat ditambahkan ke sistem proyek.

Biasanya, pelaksana item proyek ingin memanfaatkan proyek yang sudah sepenuhnya dibuat dan ditingkatkan karena mereka perlu mengetahui apa referensi proyek dan properti proyek lain apa yang ada untuk membuat keputusan peningkatan.

Untuk mendapatkan pemberitahuan peningkatan proyek

  1. Atur SolutionOrProjectUpgrading bendera (ditentukan dalam vsshell80.idl) dalam implementasi item proyek Anda. Ini menyebabkan item proyek Anda VSPackage dimuat secara otomatis saat shell Visual Studio menentukan bahwa sistem proyek sedang dalam proses peningkatan.

  2. Atur antarmuka IVsSolutionEventsProjectUpgrade dengan menggunakan metode AdviseSolutionEvents.

  3. Antarmuka IVsSolutionEventsProjectUpgrade diaktifkan setelah implementasi sistem proyek menyelesaikan operasi peningkatannya dan proyek baru yang ditingkatkan dibuat. Tergantung pada skenario, antarmuka IVsSolutionEventsProjectUpgrade diaktifkan setelah metode OnAfterOpenSolution, OnAfterOpenProject, atau OnAfterLoadProject.

Untuk memutakhirkan berkas item proyek

  1. Anda harus mengelola proses pencadangan file dengan hati-hati dalam implementasi item proyek Anda. Ini berlaku khusus untuk cadangan berdampinganfUpgradeFlag, di mana parameter metode UpgradeProject diatur ke PUVFF_SXSBACKUP, di mana file yang telah dicadangkan ditempatkan bersama-sama dengan file yang ditandai sebagai ".old". File yang dicadangkan yang lebih lama dari waktu sistem saat proyek ditingkatkan dapat dianggap sebagai basi. Selain itu, mereka mungkin ditimpa kecuali Anda mengambil langkah-langkah khusus untuk mencegah hal ini.

  2. Pada saat item proyek Anda menerima pemberitahuan peningkatan proyek, Visual Studio Conversion Wizard masih ditampilkan. Oleh karena itu, Anda harus menggunakan metode IVsUpgradeLogger antarmuka untuk menyediakan pesan peningkatan ke UI wizard.