2017-07-28 209 views
1

我一直在搜尋StackOverflow,博客和FireGiants教程以獲得幾天的明確答案。似乎每個人都有與WiX做一些稍微不同的方式,並且沒有足夠的代碼來真正回答我遇到的問題。WiX安裝條件

我有一個安裝程序,它將創建文件夾,向下複製文件,註冊DCOM dll,添加服務和註冊表項。所有這些工作正常。甚至設法最終創建一個自定義的用戶界面,將編譯,並沒有過多的對話來惹惱我。

什麼我不能爲我的生活找出是使用條件標籤有一個選項,只安裝客戶端文件,或者客戶端和服務器。

我有一個對話框,其中有兩個按鈕用於設置屬性,並且該屬性用於要安裝文件的條件。

DlgWelcome.wxs:

<Fragment> 
    <UI Id="WelcomeUI"> 
     <Property Id="INSTALLCLIENT" Value="0" Secure="yes"/> 
     <Property Id="INSTALLSERVER" Value="0" Secure="yes"/> 

     <Dialog Id="WelcomeDlg" Width="370" Height="270" Title="!(loc.WelcomeDlgTitle)" NoMinimize="yes"> 

     <Control Type="Text" Id="WelcomeDlgTxt" Width="350" Height="30" X="10" Y="60" Text="!(loc.WelcomeDlgText)" /> 

     <Control Type="PushButton" Id="InstallClient" Width="350" Height="50" X="10" Y="90"> 
      <Text>!(loc.ClientInstallBtnText)</Text> 
      <Publish Property="INSTALLCLIENT" Value="1"/> 
      <Publish Event="NewDialog" Value="ProgressDlg"/> 
     </Control> 

     <Control Type="PushButton" Id="InstallServer" Width="350" Height="50" X="10" Y="150"> 
      <Text>(loc.InstallServerBtnText)</Text> 
      <Publish Property="INSTALLSERVER" Value="1"/> 
      <Publish Property="INSTALLCLIENT" Value="1"/> 
      <Publish Event="NewDialog" Value="ProgressDlg" /> 
     </Control> 
    </UI> 
</Fragment> 

Product.wxs:

... 
<Feature Id="Installation" Title="Install Stuffs" Display="expand"> 
     <Feature Id="ServerInstall" Level="1" > 
     <ComponentGroupRef Id="ServerFiles" /> 
     <ComponentRef Id="RegistryForServer"/> 
     <Condition Level="0">INSTALLSERVER</Condition> 
     </Feature> 

     <Feature Id="ClientInstall" Level="1" > 
     <ComponentGroupRef Id="ClientFiles"/> 
     <ComponentRef Id="RegistryForClient"/> 
     <Condition Level="0">INSTALLCLIENT</Condition> 
     </Feature> 
</Feature> 

<UI> 
     <InstallUISequence> 
     <CostInitialize /> 
     <FileCost /> 
     <CostFinalize /> 
     <Show Dialog="WelcomeDlg" After="CostFinalize"/> 
     <ExecuteAction /> 
     </InstallUISequence>  
</UI> 

一些我已經試過了我見過的驗證解決方案的各個崗位都有過的事情顯然解決了類似的問題(不能確認他們是否使用相同版本的WiX,但沒有工作):

  • 如果以不同的方式聲明屬性:可以從命令行訪問的所有大小寫(我不使用),以及....這兩者似乎都不起作用。
  • 將條件移至各個組件。什麼也沒做。
  • 移動NewDialog前後的Publish屬性標籤。沒有效果。
  • 使財產安全。沒有。

所以我在我的智慧結束與此。有人能指出我做錯了什麼,所以我可以完成這個安裝程序,並希望永遠不會再看到WiX?

+0

如果您希望在任何一種情況下安裝客戶端文件,您是否有必要將INSTALLCLIENT作​​爲條件?我懷疑這實際上可以解決您的問題,但它可能會使代碼稍微複雜一些。 –

+0

這不是,來想一想吧。我會刪除它。這對於將來的打樣比什麼都重要,將來安裝人員可能會需要更多的選擇。但問題仍然是我缺少一些關於條件如何工作的東西。 – Daealis

+0

請嘗試我的解決方案,如果這不起作用,請仔細研究條件標籤的級別屬性是如何工作的,因爲我相當確定問題出在哪裏。 –

回答

0

試試這個:

<Control Type="PushButton" Id="InstallClient" Width="350" Height="50" X="10" Y="90"> 
    <Text>!(loc.ClientInstallBtnText)</Text> 
    <Publish Property="INSTALLLEVEL" Value="2"/> 
    <Publish Event="NewDialog" Value="ProgressDlg"/> 
</Control> 

<Control Type="PushButton" Id="InstallServer" Width="350" Height="50" X="10" Y="150"> 
    <Text>(loc.InstallServerBtnText)</Text> 
    <Publish Property="INSTALLLEVEL" Value="5"/> 
    <Publish Event="NewDialog" Value="ProgressDlg" /> 
</Control> 

... 

<Feature Id="Installation" Title="Install Stuffs" Display="expand"> 
    <Feature Id="ServerInstall" Level="3" > 
    <ComponentGroupRef Id="ServerFiles" /> 
    <ComponentRef Id="RegistryForServer"/> 
    </Feature> 

    <Feature Id="ClientInstall" Level="1" > 
    <ComponentGroupRef Id="ClientFiles"/> 
    <ComponentRef Id="RegistryForClient"/> 
    </Feature> 

我不認爲你真的要修改INSTALLLEVEL這樣的,但它可能對現在的工作。

+0

我認爲這是一個好主意,可以減少所需的屬性數量。但條件不變:如果使用Condition標籤,則不會安裝該功能中的任何內容。 – Daealis

+0

哦,請繼續,爲什麼你有兩個嵌套在另一個Feature標籤下的功能? –

+0

最初不,我將服務器和客戶端文件放在不同的功能上。然後,我將它們放在一個名爲「Install」的通用雛鳥功能下。這是我在其他解決方案中看到的另一件事,我想也許就是這樣。沒有改變,超級功能是否有水平。 – Daealis

0

你要做的是非常標準的Windows安裝程序/微星,而不是特定於WiX。 WiX的版本無關緊要。

你想要做的是在安裝程序中設置默認的INSTALLLEVEL。通常100是一個很好的水平來設置它。

對於您的每個功能(客戶端或服務器),請在Feature表中設置「級別」屬性。

如果功能的級別小於安裝程序的INSTALLLEVEL,它將安裝該功能。您只需在運行時設置此屬性即可確定要安裝的功能。