WiX yükleyici yükseltmesi nasıl uygulanır?


233

İş yerinde kullanıyoruz yerinde kurulum paketleri oluşturmak için WiX . X ürününün kurulumunun, o makinede o ürünün önceki sürümünün kaldırılmasına neden olmasını istiyoruz.

Internet üzerinde büyük bir yükseltme hakkında çeşitli yerlerde okudum ama işe yaramadı. Herkes WiX'e önceki sürümü kaldır özelliğini eklemek için atmam gereken adımları belirtebilir mi?

Yanıtlar:


189

En yeni sürümlerde (3.5.1315.0 beta sürümünden), kendi sürümünüzü kullanmak yerine MajorUpgrade öğesini kullanabilirsiniz .

Örneğin, otomatik yükseltme yapmak için bu kodu kullanırız. Sürüm düşürmeleri önler, yerelleştirilmiş bir hata mesajı verir ve zaten var olan özdeş bir sürümün yükseltilmesini önler (yani yalnızca daha düşük sürümler yükseltilir):

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

8
Bob Arnson'un bu konudaki blog yazısı çok güzel bilgiler veriyor .
Dave Andersen

17
Not: Hiçbir yere belgelenmemiştir, ancak " <MajorUpgrade>" öğesi daha sonra yerleştirilmelidir <Package>. Aksi takdirde, candleşu hatayı verir: "CNDL0107 hatası: Satır 1, sütun 473'te şu hatayla şema doğrulaması başarısız oldu: ' schemas.microsoft.com/wix/2006/wi ' ad alanında 'Ürün' öğesi geçersiz alt öğeye sahip ' MajorUpgrade 'ad alanında' schemas.microsoft.com/wix/2006/wi '. Beklenen olası öğelerin listesi:' Paket '. ".
Rob W

21
+1 Bu yanıtın mümkün olduğunca çok oy alması gerekiyor; 5 kat daha fazla oyu olan, ancak eski yaklaşımları kullanan bir cevapla gitmek çok cazip.
Lynn Crumbling

1
İyi bir nokta. Bir örnek ekledim ki insanlar sadece bir tane olmadığı için görmezden gelmiyorlar!
Ant

6
Sadece belirtmeniz gerekmediğini belirtmek AllowDowngradesveya AllowSameVersionUpgrades. Varsayılan olarak zaten yok.
Aydınlık

221

Sonunda bir çözüm buldum - burada aynı sorunu olan diğer insanlar için gönderiyorum (hepiniz 5):

  • Ürün kimliğini * olarak değiştirin
  • Ürün altında aşağıdakileri ekleyin:

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="YOUR_GUID">  
       <UpgradeVersion
          Minimum="1.0.0.0" Maximum="99.0.0.0"
          Property="PREVIOUSVERSIONSINSTALLED"
          IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade> 
  • InstallExecuteSequence altında şunu ekleyin:

    <RemoveExistingProducts Before="InstallInitialize" /> 

Bundan sonra ürünü her yüklediğimde önceki yüklü sürümleri kaldırmıştı.

Not: yükseltme kimliğini kendi GUID'inizle değiştirin


153
evet, WiX öğrenmek, birisinin basit bir eylem gerçekleştirmek için 'mantıklı' olduğuna karar verdiği belirsiz büyüler anlamaya çalışmak gibidir. UNIX gibi.
mmr 25'09

6
Ayrıca, "Ürün kimliğini * olarak değiştir" tam olarak ne yapar? Her seferinde yeni bir ürün kimliği oluşturuyor mu? Ürününüzün artık sabit bir kimliği olmamasının sonuçları var mı? - aşırıya kaçmış gibi geliyor.
Anthony

10
@Antony, @Dror Helper: Burada yeni bir GUID oluşturmak için "*" kullanmamanız gerektiğinden eminim. (Upgrade Id = "") içindeki GUID sabit kodlanmış ve sabitlenmiş olmalı ve (Product UpgradeCode = "") özelliğinizdeki GUID ile eşleşmelidir.
Jonathan Hartley

37
Ben muhtemelen orada örnek gerçek bir GUID DEĞİL düzenlemek gerekir. Eminim insanlar bunu kopyalayıp yapıştıracak ve kelimesi kelimesine kullanacaktır. Belki "ÜRÜNÜNÜZÜN YÜKSELTME MODELİ-KILAVUZU-BURAYA" kullanın?
Kahverengi

12
Örneğinizde bir hata var. MSI'ler ProductVersionyalnızca üç sürüm alanını destekler; bu nedenle dördüncü alan hiç karşılaştırılmayacaktır. Msdn.microsoft.com/en-us/library/aa372379(VS.85).aspx
Sridhar Ratnakumar 26:10

89

Büyük yükseltmeler için kullandığım sözdizimi aşağıdadır:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
 <Upgrade Id="PUT-GUID-HERE">
    <UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
    <UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

@Brian Gillespie'nin belirttiği gibi, istenen optimizasyonlara bağlı olarak RemoveExistingProducts'ı planlamak için başka yerler var. PUT-GUID-HERE'ın aynı olması gerektiğini unutmayın.


2
Burada Wix'teki Nick Ramirez'in kitabındaki "Yükseltme ve Yamalama" bölümünü okuyorum ve InstallInitialize'dan sonra RemoveExistingProducts'ı planladığınızda, o zaman da programlamanız gerektiğini belirtir <InstallExecute After="RemoveExistingProducts" />. Örneğinizde bu yok - bu kitabın yanlış olduğu anlamına mı geliyor?
Wim Coenen

3
Ben asla açıkça InstallExecute zamanlama.
Rob Mensching

1
Yapmıyorum. WiX v3.6'da, Burn küçük yükseltmelerin yürütülmesini kolaylaştıracak, ancak Burn olmadan Minör Yükseltmeleri temel olarak işe yaramaz hale getiren kullanıcının manuel etkileşimini (komut satırı seçenekleri sunmak zorunda) gerektirir. :)
Rob Mensching

1
@RobMensching: Eski bir sürümün daha yeni bir sürümün üzerine yüklenmesini nasıl önlersiniz? Cevabınız benim için çalışıyor (WiX v3.5.2519.0 ile derleyebileceğim tek "büyük yükseltme" örneği), ancak daha eski bir sürüm yüklemek mümkündür (bundan sonra, "Ekle / Programları Kaldır ").
Christian Specht

4
Tamam, sadece buldum MajorUpgrade elemanı içinde bu cevap önlenmesi düşürdü dahil istediğim tam olarak ne yapar ki.
Christian Specht

40

Ürün öğesinin içindeki Yükseltme öğesi, eylemin uygun şekilde planlanmasıyla birleştirildikten sonra kaldırma işlemini gerçekleştirir. Kaldırmak istediğiniz tüm ürünlerin yükseltme kodlarını listelediğinizden emin olun.

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

Yapılarınıza dikkat ederseniz, insanların yanlışlıkla ürününüzün eski bir sürümünü daha yenisine yüklemelerini engelleyebileceğinizi unutmayın. Maksimum alanı bunun içindir. Yükleyiciler oluşturduğumuzda, UpgradeVersion Maximum'u oluşturulmuş sürüme ayarlıyoruz, ancak bu senaryoyu önlemek için IncludeMaximum = "no" değerini ayarladık.

RemoveExistingProducts zamanlaması ile ilgili seçenekleriniz var. Ben InstallFinalize sonra (diğerleri tavsiye gibi InstallInitialize sonra) zamanlama tercih:

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>

Bu, yeni dosyalar ve kayıt defteri anahtarları kopyalanana kadar ürünün önceki sürümünü yükler. Bu, verileri eski sürümden yenisine taşımamı sağlar (örneğin, kullanıcı tercihlerinin depolanmasını kayıt defterinden bir XML dosyasına değiştirdiniz, ancak kibar olmak ve ayarlarını taşımak istiyorsunuz). Bu taşıma, InstallFinalize'dan hemen önce ertelenmiş bir özel eylemde yapılır.

Başka bir avantajı verimliliktir: değişmeyen dosyalar varsa, Windows Installer, InstallFinalize'dan sonra zamanladığınızda bunları tekrar kopyalamaktan rahatsız olmaz. InstallInitialize'dan sonra zamanlama yaparsanız, önce önceki sürüm tamamen kaldırılır ve ardından yeni sürüm yüklenir. Bu, dosyaların gereksiz şekilde silinmesine ve yeniden kopyalanmasına neden olur.

Diğer zamanlama seçenekleri için MSDN'deki RemoveExistingProducts yardım konusuna bakın. Bu hafta, bağlantı: http://msdn.microsoft.com/en-us/library/aa371197.aspx


2
@Brian Gillespie: "... değişmeyen dosyalar varsa ..." ne anlama geliyor? Windows Installer'ın bir dosyayı ne zaman değiştireceğine, AssemblyVersion, AssemblyFileVersion, dosya boyutuna, ... ilişkin ölçütler nelerdir?
donttellya

2
@donttellya +1 bunu zor yoldan öğrendi. RemoveExistingProductssonra planlandı InstallFinalizeve dlls, assemblyVersion değişmedi, ancak AssemblyProduct gibi diğer alanlar olduğu için güncellenmiyordu. Ben dosya karşılaştırma rutinin merhametinde olmak istemiyorum - ben sadece önceki app GONE istiyorum
wal

16

Bunu WiX kullanıcıları posta listesinde sormak daha iyi olabilir .

WiX en iyi Windows Installer'ın ne yaptığını iyi anlayarak kullanılır. " Windows Installer için Kesin Kılavuz " almayı düşünebilirsiniz .

Mevcut bir ürünü kaldıran eylem RemoveExistingProducts eylemidir . Yaptığı işlemin sonuçları, planlandığı yere - yani bir hatanın eski ürünün yeniden yüklenmesine neden olup olmadığına ve değiştirilmemiş dosyaların tekrar kopyalanıp kopyalanmayacağına bağlı olduğu için - kendiniz zamanlamanız gerekir.

RemoveExistingProducts süreçler <Upgrade>@Idöznitelikleri sistemde yüklü tüm ürünlerin (öğede UpgradeCodebelirtilen <Product>) ile eşleştirerek geçerli kurulumdaki öğeleri . UpgradeCodeİlgili ürünlerin bir aile tanımlar. Bu UpgradeCode'a sahip, sürümleri belirtilen aralığa giren ve UpgradeVersion/@OnlyDetectözelliğin olduğu no(veya atlandığı) tüm ürünler kaldırılacaktır.

Özelliğin RemoveExistingProductsayarlanmasıyla ilgili belgeler UPGRADINGPRODUCTCODE. Bu, kaldırılan ürün için kaldırma işleminin , değeri Product/@Idyüklenen ürün için olan özelliği aldığı anlamına gelir .

Orijinal kurulumunuzda bir içermiyorsa UpgradeCode, bu özelliği kullanamazsınız.


21
Hiç şüphe yok ki Mike, tam olarak ne hakkında konuştuğunu tam olarak biliyor, ancak Windows Installer'ın ne yaptığına dair sağlam bir anlayışla zihnimi karıştırmayı düşünmekten umutsuzluğa çekiyor. Bilmeden önce, çevre dostu teknoloji merkezi şehirlerindeki, çevre yolunun ötesindeki Kurumsal müşterilere, TPS raporlarımı doldurarak ve hayatın neden bu kadar boş göründüğünü merak ederek Java ve .NET danışmanlık işleri yapacağım. Bir sonraki projem NSIS ile kurulabilir, bu da tüm hataları için, mantıksız montaj benzeri bir dil gibi, Windows Installer'ın ne yaptığını anlamamı sağladı.
Jonathan Hartley

2
@Tartley - InnoSetup ile gidin, bu size montaj benzeri bir dil kazandıracaktır :) IStool'u da aldığınızdan emin olun, çok yardımcı olur. Ayrıca - basit yüklemeler için tüm bunların çok karmaşık olduğunu kabul ettim, ancak bence SQL Server 2008 gibi bir şey yüklemek için bu karmaşıklığa gerçekten ihtiyaçları var ...
Roman Starkov

11

Bu siteyi WiX Upgrade ile ilgili temel bilgileri anlamama yardımcı olmak için kullandım:

http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

Daha sonra bir örnek Installer oluşturdum, (bir test dosyası kurdum), sonra Upgrade installer'ı kurdum (kurulu 2 örnek test dosyası). Bu, mekanizmanın nasıl çalıştığı hakkında temel bir anlayış verecektir.

Mike'ın Apress, "Windows Installer için Kesin Kılavuz" kitabında söylediği gibi, anlamanıza yardımcı olacak, ancak WiX kullanılarak yazılmamış.

Oldukça yardımcı olan başka bir site bu oldu:

http://www.wixwiki.com/index.php?title=Main_Page


Sayfadaki örnek beklendiği gibi çalışmıyor wix.tramontana.co.hu/tutorial/upgrades-and-modularization/… . Onunla oynadım. Sayfa yasaklanacağını belirttiğinde alt sürüme geçmek bile mümkündür
sergtk

10

WiX belgelerini okudum, örnekleri indirdim , ancak hala yükseltmelerle ilgili birçok sorunum vardı. Küçük yükseltmeler, bu kaldırma belirtme olasılığına rağmen, önceki ürünlerin kaldırılmasını gerçekleştirmez. İncelemeler için bir günden daha fazla zaman harcadım ve WiX 3.5'in yükseltmeler için yeni bir etiket yerleştirdiğini gördüm. İşte kullanımı:

<MajorUpgrade Schedule="afterInstallInitialize"
        DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." 
        AllowDowngrades="no" />

Ancak sorunların ana nedeni , belgelerin küçük ve küçük yükseltmeler için " REINSTALL = ALL REINSTALLMODE = vomus " parametrelerini kullandığını söylemesi, ancak bu parametrelerin büyük yükseltmeler için YASAKLANMADIĞINI söylemez - sadece çalışmayı bırakırlar . Bu yüzden onları büyük yükseltmelerle kullanmamalısınız.



7

Bir süredir derslerden kaçırdığım önemli bir şey ( http://www.tramontana.co.hu/wix/lesson4.php adresinden çalındı) ) "Bu ürünün başka bir sürümü zaten yüklü" hatalarıyla sonuçlandı:

* Küçük güncellemeler , değişikliğin ürün sürümünün değiştirilmesini gerektirmediği bir veya birkaç dosyada küçük değişiklikler anlamına gelir (major.minor.build). Ürün GUID'ini de değiştirmeniz gerekmez. Herhangi bir açıdan öncekilerden farklı yeni bir .msi dosyası oluştururken Paket GUID'ini her zaman değiştirmeniz gerektiğini unutmayın. Yükleyici, yüklü programlarınızı izler ve kullanıcı bu GUID'leri kullanarak yüklemeyi değiştirmek veya kaldırmak istediğinde bulur. Farklı paketler için aynı GUID'i kullanmak Yükleyiciyi karıştırır.

Küçük yükseltmeler , ürün sürümünün zaten değişeceği yerleri gösterir. Ürün etiketinin Sürüm özelliğini değiştirin. Ürün aynı kalacaktır, bu nedenle Ürün GUID'ini değiştirmeniz gerekmez, ancak elbette yeni bir Paket GUID'si edinin.

Büyük yükseltmeler , bir tam sürümden diğerine geçmek gibi önemli değişiklikleri gösterir. Her şeyi değiştirin: Sürüm özelliği, Ürün ve Paket GUID'leri.


3
Paket: Kimlik türü: AutogenGuid açıklaması: Bir ürün veya birleştirme modülü için paket kodu GUID'si. Bir ürün derlenirken, her yapı için paket kodunun oluşturulmasına izin vermek için bu özellik ayarlanmamalıdır. Bir birleştirme modülü derlenirken, bu özniteliğin modülerleştirme kılavuzuna ayarlanması gerekir. ---- bu yüzden paket kimliğine dikkat etmemiz gerekmiyor, değil mi?
Cooper.Wu

Bağlantınız öldü
bam500

5

WiX'in (3.0) en son sürümünü kullanıyorum ve yukarıdaki çalışmayı alamadım. Ancak bu işe yaradı:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
     Minimum="1.0.0.0"  IncludeMinimum="yes"
     Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>

PUT-GUID-HERE ürününün UpgradeCode özelliğinde tanımladığınız GUID ile aynı olmalıdır.


2

Aşağıda benim için çalıştı.

<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0" 
    Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
    <UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0" 
        RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

Lütfen Üründeki UpgradeCode'un Yükseltmedeki Kimlik ile eşleştiğinden emin olun.


1

Büyük DOWN notlarında bile benim için işe yarayan buydu :

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.