2017-07-28 149 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,它将安装该功能。您只需在运行时设置此属性即可确定要安装的功能。