2012-10-16 4 views
9

zaten yüklü olan hangi maddelerin belirleyin:WiX Yanık - Her biri doğrudan gibi bir zincirde üç MsiPackages, biriyle alakalı - Ben kullanıcı üç seçenekten hangi yüklemek için seçebileceğiniz sayede bir yanık yüklemesini ettik

<Chain> 
    <MsiPackage SourceFile="..\ProductA\bin\Release\ProductA.msi" InstallCondition="chkProductA" /> 
    <MsiPackage SourceFile="..\ProductB\bin\Release\ProductB.msi" InstallCondition="chkProductA" /> 
    <MsiPackage SourceFile="..\ProductC\bin\Release\ProductC.msi" InstallCondition="chkProductC" /> 
</Chain> 

Hepsi güzel. Ancak, msi'yi bir sonraki seferde çalıştırdığımda, yalnızca orijinal olarak seçilen öğeleri yeniden yüklemek/güncellemek istiyorum - yani yalnızca productA seçildiyse, ürün yüklemek istemiyorum B& C.

Nasıl? Başlangıçta neyin seçildiğini belirliyor muyum?

cevap

11

Tamam, Tamam, bu yüzden en iyisi çözümümümü gönderirim.

Sonuçta bu

a) yüklemesinde ayarlanan Ürün MSI en her birinde bir kayıt anahtarı belirleyerek ... iki kısımdan aşağı kaynar. Açıkçası, MSI özgün olarak yüklenmemişse, kayıt defteri girdisi mevcut olmayacaktır. UI kullanıldığında yükseltme yaparken yanma o defteri anahtarının varlığını kontrol etme yani

<!-- registry entry to state that the item has been installed--> 
    <Component Id="cmp_WriteToRegistry" Guid="[yourguid]"> 
    <RegistryKey Root="HKLM" 
       Key="Software\MyCompany]" 
      Action="createAndRemoveOnUninstall"> 
     <RegistryValue Type="integer" Name="ProductA" Value="1" KeyPath="yes"/> 
    </RegistryKey> 
    </Component> 

b) ... Yani InstallCondition içinde

<!-- Determine what items are to be installed in the event of an install using the BA--> 
<WixVariable Id="chkProductA" Value="![CDATA[chkProductA]]" /> 
<WixVariable Id="chkProductB" Value="![CDATA[chkProductB]]" /> 
<WixVariable Id="chkProductC" Value="![CDATA[chkProductC]]" /> 

<!-- Determine what items are installed in the event of an upgrade--> 
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductAInstalled" Variable="ProductAInstalled" Result="exists" /> 
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductBInstalled" Variable="ProductBInstalled" Result="exists" /> 
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductCInstalled" Variable="ProductCInstalled" Result="exists" /> 

<Chain> 
    <MsiPackage SourceFile="..\SetupProductA\bin\Release\SetupProductA.msi" 
       InstallCondition="chkProductA OR ProductAInstalled" /> 
    <MsiPackage SourceFile="..\SetupProductB\bin\Release\SetupProductB.msi" 
       InstallCondition="(chkProductB) OR (ProductBInstalled)" /> 
    <MsiPackage SourceFile="..\SetupProductC\bin\Release\SetupProductC.msi" 
       InstallCondition="(chkProductC) OR (ProductCInstalled)" /> 
</Chain> 

</Bundle> 

, chkProductA doğru olarak değerlendirilir ve İlgili onay kutusu işaretlidir ve ilgili ürün yüklendiğinde ProductAInstalled değeri doğrudur - benim durumumda olan ve kullanıcı etkileşimi olmadan yapılan güncellemeyle ilgilenir.

Nasıl olduğunu bildiğiniz zaman kolay. Benzer bir şey algılamak için yapılabilir

CustomBA_DetectPackageComplete(object sender, DetectPackageCompleteEventArgs e) 
{ 
    if (e.PackageId == "SetupProductA" && e.State == PackageState.Present) 
    { 
     CustomBA.Engine.NumericVariables["chkProductA"] = 1; 
    } 
    etc... 
} 

: Kesinlikle kendi yönetilen bootstrapper uygulaması yapıyorsanız

+0

Kendi soru sorunuzu tekrar cevaplamanın eski görgü kuralları ... Eğer daha iyi bir cevaba sahip olursa, yukarıdaki cevabı olduğu gibi, bunu duymaktan gerçekten memnun olurum, EN İYİ olmayabilir. Bir haftada daha iyi cevaplar yoksa veya bunu cevap olarak ayarlayacağım. Puanlar için balık tutmuyorum, bu yüzden doğru olanı yapmanın doğru bir şey olduğunu ... –

+0

Sizin çözümün nasıl yapacağımı. "Mülkiyet Desenini Hatırla" a benzer: http://robmensching.com/blog/posts/2010/5/2/The-WiX-toolsets-Remember-Property-pattern – BryanJ

+0

Teşekkürler Bryan. Ben hala tekerlek sahnesini yeniden başlatıyorum/yeniden icat ediyorum, bu yüzden bilmek güzel. –

4

, bir DetectPackageComplete olay işleyicisi yapabilirsiniz ... başlamak vermedi DetectMsiFeature kullanarak yüklü özellikler.

Bu söyleniyor ki, zaten özel bir BA'ınız varsa, bu yöntemi kullanacağım. Özel bir BA oluşturmak, işin bir lot olduğunu.

+0

Kayıtlı aramaları özel yönetilen boostraper uygulamasında da yapmayı mı düşünüyorsunuz? –

+0

@phoenix, paketinizdeki msi'nin güncellenmiş bir sürümünü eklediğiniz varsayılarak bir kayıt defteri araması yapmanız gerekmez. Yanık motoru, ilgili msi'nin paketteki yükseltme kodunu temel alarak mevcut msi'yi algılayacak ve 'DetectPackageComplete' olayını tetikleyecektir. John Wright yazdı [güzel bir örnek] (http://www.wrightfully.com/part-4-of-writing-your-own-net-based-installer-with-wix-handling-current-and-future -state /) bunun işlemden geçirilmesi. –