Di tempat kerja kami menggunakan WiX untuk membangun paket instalasi. Kami ingin instalasi produk X akan menghapus instalasi versi sebelumnya dari produk itu di mesin itu.
Saya telah membaca di beberapa tempat di Internet tentang peningkatan besar tetapi tidak berhasil. Adakah yang bisa menentukan langkah-langkah persis yang harus saya ambil untuk menambahkan menghapus fitur versi sebelumnya ke WiX?
sumber
<MajorUpgrade>
elemen " " harus ditempatkan setelahnya<Package>
. Jika tidak,candle
berikan kesalahan berikut: "kesalahan CNDL0107: Validasi skema gagal dengan kesalahan berikut di baris 1, kolom 473: Elemen 'Produk' di namespace ' schemas.microsoft.com/wix/2006/wi ' memiliki elemen anak yang tidak valid ' MajorUpgrade 'in namespace' schemas.microsoft.com/wix/2006/wi '. Daftar elemen yang mungkin diharapkan:' Paket '. "AllowDowngrades
atauAllowSameVersionUpgrades
. Mereka sudah default ke no.Akhirnya saya menemukan solusi - Saya mempostingnya di sini untuk orang lain yang mungkin memiliki masalah yang sama (kalian semua 5):
Di bawah produk tambahkan yang berikut ini:
Di bawah InstallExecuteSequence, tambahkan:
Mulai sekarang setiap kali saya menginstal produk itu menghapus versi yang diinstal sebelumnya.
Catatan: ganti Id peningkatan dengan GUID Anda sendiri
sumber
ProductVersion
hanya mendukung tiga bidang versi; oleh karena itu bidang keempat tidak akan dibandingkan sama sekali. Lihat catatan di bawah VersionMin dan VersionMax di msdn.microsoft.com/en-us/library/aa372379(VS.85).aspxBerikut ini adalah jenis sintaks yang saya gunakan untuk peningkatan besar:
Sebagai @Brian Gillespie mencatat ada tempat lain untuk menjadwalkan RemoveExistingProducts tergantung pada optimasi yang diinginkan. Perhatikan bahwa PUT-GUID-HERE harus identik.
sumber
<InstallExecute After="RemoveExistingProducts" />
. Contoh Anda tidak memiliki ini - apakah itu berarti bukunya salah?Elemen Upgrade di dalam elemen Produk, dikombinasikan dengan penjadwalan tindakan yang tepat akan melakukan uninstall yang Anda cari. Pastikan untuk mencantumkan kode peningkatan semua produk yang ingin Anda hapus.
Perhatikan bahwa, jika Anda berhati-hati dengan bangunan Anda, Anda dapat mencegah orang lain memasang versi produk Anda yang lebih lama secara tidak sengaja pada versi yang lebih baru. Untuk itulah bidang Maksimal. Ketika kami membangun installer, kami mengatur UpgradeVersion Maximum ke versi yang sedang dibangun, tetapi IncludeMaximum = "no" untuk mencegah skenario ini.
Anda memiliki pilihan mengenai penjadwalan RemoveExistingProducts. Saya lebih suka menjadwalkannya setelah InstallFinalize (daripada setelah InstallInitialize seperti yang direkomendasikan orang lain):
Ini meninggalkan versi produk yang diinstal sebelumnya hingga file baru dan kunci registri disalin. Ini memungkinkan saya memigrasikan data dari versi lama ke yang baru (misalnya, Anda telah mengubah penyimpanan preferensi pengguna dari registri ke file XML, tetapi Anda ingin sopan dan memigrasi pengaturannya). Migrasi ini dilakukan dalam tindakan kustom yang ditangguhkan sebelum InstallFinalize.
Manfaat lain adalah efisiensi: jika ada file tidak berubah, Pemasang Windows tidak repot menyalinnya lagi ketika Anda menjadwalkan setelah InstallFinalize. Jika Anda menjadwalkan setelah InstallInitialize, versi sebelumnya sepenuhnya dihapus terlebih dahulu, dan kemudian versi baru diinstal. Ini menghasilkan penghapusan yang tidak perlu dan penyalinan ulang file.
Untuk opsi penjadwalan lainnya, lihat topik bantuan RemoveExistingProducts di MSDN. Minggu ini, tautannya adalah: http://msdn.microsoft.com/en-us/library/aa371197.aspx
sumber
RemoveExistingProducts
dijadwalkan setelahInstallFinalize
dan dll tidak diperbarui karena assemblyVersion tidak berubah tetapi bidang lain seperti AssemblyProduct adalah. Saya tidak ingin berada dalam belas kasihan dari rutin perbandingan file - saya hanya ingin aplikasi sebelumnya PERGIAnda mungkin lebih baik menanyakan hal ini pada milis pengguna WiX .
WiX paling baik digunakan dengan pemahaman yang kuat tentang apa yang dilakukan Penginstal Windows. Anda mungkin mempertimbangkan untuk mendapatkan " Panduan Definitif untuk Pemasang Windows ".
Tindakan yang menghapus produk yang ada adalah tindakan RemoveExistingProducts . Karena konsekuensi dari apa yang dilakukannya tergantung pada tempat dijadwalkannya - yaitu, apakah kegagalan menyebabkan produk lama diinstal ulang, dan apakah file yang tidak diubah disalin lagi - Anda harus menjadwalkannya sendiri.
RemoveExistingProducts
memproses<Upgrade>
elemen dalam instalasi saat ini, mencocokkan@Id
atribut denganUpgradeCode
(ditentukan dalam<Product>
elemen) dari semua produk yang diinstal pada sistem. YangUpgradeCode
mendefinisikan keluarga produk terkait. Produk apa pun yang memiliki UpgradeCode ini, yang versinya termasuk dalam kisaran yang ditentukan, dan di manaUpgradeVersion/@OnlyDetect
atributnyano
(atau dihilangkan), akan dihapus.Dokumentasi untuk
RemoveExistingProducts
menyebutkan pengaturanUPGRADINGPRODUCTCODE
properti. Ini berarti bahwa proses penghapusan instalasi untuk produk yang dihapus menerima properti itu, yang nilainya adalahProduct/@Id
untuk produk yang sedang diinstal.Jika instalasi asli Anda tidak menyertakan
UpgradeCode
, Anda tidak akan dapat menggunakan fitur ini.sumber
Saya menggunakan situs ini untuk membantu saya memahami dasar-dasar tentang Peningkatan WiX:
http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization
Setelah itu saya membuat Penginstal sampel, (menginstal file uji), kemudian membuat installer Upgrade (menginstal 2 file uji sampel). Ini akan memberi Anda pemahaman dasar tentang bagaimana mekanisme bekerja.
Dan seperti yang dikatakan Mike dalam buku dari Apress, "The Definitive Guide to Windows Installer", itu akan membantu Anda memahami, tetapi tidak ditulis menggunakan WiX.
Situs lain yang cukup membantu adalah situs ini:
http://www.wixwiki.com/index.php?title=Main_Page
sumber
Saya membaca dokumentasi WiX , contoh-contoh yang diunduh, tetapi saya masih memiliki banyak masalah dengan peningkatan. Pembaruan kecil tidak mengeksekusi pencopotan produk sebelumnya meskipun ada kemungkinan untuk menentukan pencopotan tersebut. Saya menghabiskan lebih dari satu hari untuk penyelidikan dan menemukan bahwa WiX 3.5 memperkenalkan tag baru untuk peningkatan. Ini adalah penggunaannya:
Tetapi alasan utama masalah adalah bahwa dokumentasi mengatakan untuk menggunakan parameter " REINSTALL = ALL REINSTALLMODE = vomus " untuk peningkatan kecil dan kecil, tetapi tidak mengatakan bahwa parameter tersebut DILARANG untuk peningkatan besar - mereka hanya berhenti bekerja. Jadi Anda tidak harus menggunakannya dengan peningkatan besar.
sumber
Saya sarankan melihat tutorial Alex Shevchuk. Dia menjelaskan "peningkatan besar" melalui WiX dengan contoh langsung di Dari MSI ke WiX, Bagian 8 - Peningkatan Besar .
sumber
Satu hal penting yang saya lewatkan dari tutorial untuk sementara waktu (dicuri dari http://www.tramontana.co.hu/wix/lesson4.php ) yang menghasilkan kesalahan "Versi lain dari produk ini sudah diinstal":
* Pembaruan kecil kecil berarti perubahan kecil ke satu atau beberapa file di mana perubahan tidak menjamin mengubah versi produk (major.minor.build). Anda juga tidak perlu mengubah GUID Produk. Perhatikan bahwa Anda selalu harus mengubah GUID Paket ketika Anda membuat file .msi baru yang berbeda dari yang sebelumnya dalam hal apa pun. Pemasang melacak program yang Anda instal dan menemukannya ketika pengguna ingin mengubah atau menghapus instalasi menggunakan GUID ini. Menggunakan GUID yang sama untuk paket yang berbeda akan membingungkan Penginstal.
Upgrade kecil menunjukkan perubahan di mana versi produk sudah akan berubah. Ubah atribut Versi dari tag Produk. Produk akan tetap sama, jadi Anda tidak perlu mengubah GUID Produk tetapi, tentu saja, dapatkan GUID Paket baru.
Peningkatan besar menunjukkan perubahan signifikan seperti beralih dari satu versi lengkap ke versi lainnya. Ubah semuanya: Atribut versi, GUID Produk dan Paket.
sumber
Saya menggunakan versi terbaru WiX (3.0) dan tidak bisa berfungsi di atas. Tapi ini berhasil:
Perhatikan bahwa PUT-GUID-HERE harus sama dengan GUID yang telah Anda tetapkan dalam properti UpgradeCode Produk.
sumber
Di bawah ini bekerja untuk saya.
Pastikan bahwa UpgradeCode dalam Produk cocok dengan Id dalam Peningkatan.
sumber
Inilah yang bekerja untuk saya, bahkan dengan kelas BAWAH utama :
sumber