1

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

根据上述文章,我已经使用功能和发布事件实现了这一点。我的 UI 中的事件如下。

在我的情况下,我将两个相互排斥的 Web 应用程序之一安装到三个不同环境之一中。我通过创建 8 个功能来做到这一点,其中 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>
4

3 回答 3

2

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

c1 -> f1 (web.config.dev) c2 -> f2 (web.config.qa) c3 -> f3 (web.config.prod)

然后为每个文件提供 web.config 的副本文件元素和互斥条件

DEPLOYMENTTYPE~="DEV" DEPLOYMENTTYPE~="QA" DEPLOYMENTTYPE~="PROD"

结果是不会安装这些组件中的 1 个。你可能会得到一个 web.config.dev 和一个 web.config 并且它会工作。

所有这些都可以使用单个功能来完成。

于 2012-05-08T16:56:53.127 回答
1

Depending on whether you want to choose the files by environment (no questions), indirect user input (related question), or direct user input (feature selection), there are various approaches to take. Christopher Painter's approach is good for the first two, but for feature selection, you might try the technique described on this InstallTalk blog post.

于 2012-05-09T11:53:30.310 回答
0

就我个人而言,我会将两个单独的应用程序拆分为两个 msi,并使用一个用于重复代码的公共库。如果需要,可以使用烧录将它们引导在一起。

此外,无需存储 web.config 的所有不同版本,因为可以在安装时使用XmlFileorXmlConfig元素修改不同的值。这种修改 web.config 文件的方法的优点是,如果值发生更改,也可以在命令行上将其传递到安装程序中,从而避免仅为了配置更改而重新构建 msi。为了使事情变得更容易,您甚至可以创建对话框来设置它们,而不是通过 msiexec 传递它们。

于 2012-05-09T08:54:56.573 回答