WIX安装程序中同一文件夹中的互斥文件

时间:2012-05-08 14:11:16

标签: wix windows-installer

我想基于WIX项目中的用户输入将互斥的应用程序部署到互斥的环境中。我所做的研究告诉我,我不能用条件来http://www.joyofsetup.com/2007/05/30/feature-conditions-and-ui/这似乎是一个相当普遍的问题,一个明确的最佳实践将是有价值的。

我已根据上述文章使用功能和发布事件来实现此功能。我的UI中的事件如下。

在我的情况下,我将两个互斥的Web应用程序之一安装到三个不同的环境之一。我这样做是为了创建8个功能,1个用于应用程序,1个用于除web.config之外的所有文件,6个用于web.config文件,具体取决于正在安装的应用程序和要安装的环境。我必须在每个功能中包含一个条件以通过ICE验证,即使它们由下面的发布元素控制,因为它们被安装到不同服务器上名为相同的目录。有没有更好的方法,或者这是这种情况的标准做法?

      <Publish Event="AddLocal" Value="WebApp"><![CDATA[ServerType="Web"]]></Publish>
      <Publish Event="Remove" Value="WebApp"><![CDATA[ServerType<>"Web"]]></Publish>
      <Publish Event="AddLocal" Value="DataApp"><![CDATA[ServerType="App"]]></Publish>
      <Publish Event="Remove" Value="DataApp"><![CDATA[ServerType<>"App"]]></Publish>
      <Publish Event="AddLocal" Value="WebDevConfigFeature"><![CDATA[ServerType="Web" AND Environment="Dev" ]]></Publish>
      <Publish Event="Remove" Value="WebDevConfigFeature"><![CDATA[ServerType<>"Web" OR Environment<>"Dev"]]></Publish>
      <Publish Event="AddLocal" Value="WebQAConfigFeature"><![CDATA[ServerType="Web" AND Environment="QA" ]]></Publish>
      <Publish Event="Remove" Value="WebQAConfigFeature"><![CDATA[ServerType<>"Web" OR Environment<>"QA"]]></Publish>
      <Publish Event="AddLocal" Value="WebProdConfigFeature"><![CDATA[ServerType="Web" AND Environment="Prod" ]]></Publish>
      <Publish Event="Remove" Value="WebProdConfigFeature"><![CDATA[ServerType<>"Web" OR Environment<>"Prod"]]></Publish>
      <Publish Event="AddLocal" Value="AppDevConfigFeature"><![CDATA[ServerType="App" AND Environment="Dev" ]]></Publish>
      <Publish Event="Remove" Value="AppDevConfigFeature"><![CDATA[ServerType<>"App" OR Environment<>"Dev"]]></Publish>
      <Publish Event="AddLocal" Value="AppQAConfigFeature"><![CDATA[ServerType="App" AND Environment="QA" ]]></Publish>
      <Publish Event="Remove" Value="AppQAConfigFeature"><![CDATA[ServerType<>"App" OR Environment<>"QA"]]></Publish>
      <Publish Event="AddLocal" Value="AppProdConfigFeature"><![CDATA[ServerType="App" AND Environment="Prod" ]]></Publish>
      <Publish Event="Remove" Value="AppProdConfigFeature"><![CDATA[ServerType<>"App" OR Environment<>"Prod"]]></Publish>
      <Publish Event="EndDialog" Value="Return">1</Publish>

3 个答案:

答案 0 :(得分:2)

我喜欢做的技巧是有2个组件和2个不同的密钥文件

c1 - &gt; f1(web.config.dev) c2 - &gt; f2(web.config.qa) c3 - &gt; f3(web.config.prod)

然后给每个文件提供web.config的复制文件元素和互斥条件

DEPLOYMENTTYPE〜= “DEV” DEPLOYMENTTYPE〜= “QA” DEPLOYMENTTYPE〜= “PROD”

结果是不会再安装这些组件中的一个。你可能会得到一个web.config.dev和一个web.config,它会起作用。

所有这一切都可以使用一个功能完成。

答案 1 :(得分:1)

根据您是要按环境选择文件(无问题),间接用户输入(相关问题)还是直接用户输入(功能选择),有多种方法可供选择。 Christopher Painter的方法适用于前两种方法,但对于特征选择,您可以尝试使用此InstallTalk blog post中描述的技术。

答案 2 :(得分:0)

就个人而言,我会将两个单独的应用程序分成两个msi,并带有一个用于重复代码的公共库。如果需要使用刻录,它们可以一起自举。

此外,无需存储web.config的所有不同版本,因为可以使用XmlFileXmlConfig元素在安装时修改不同的值。这种修改web.config文件的方法的优点是,如果它们发生变化,也可以在命令行上传递给安装程序,从而防止必须仅为配置更改重建msi。为了简化操作,您甚至可以创建对话框来设置它们,而不是通过msiexec传递它们。

相关问题