如何有条件地安装多个Web地址?

时间:2011-10-10 21:19:39

标签: wix wix3.6

我有一个网站,我正在为我们的某个内部产品安装,并想知道是否有办法设置多个<WebAddress/>块与这个网站一起有条件地安装?

考虑我的基本网站创作如下:

<Component
    Id="WebsiteComp"
    Directory="INSTALLDIR"
    Guid="{702AF20D-F9F3-45A1-B966-890855904591}"
    KeyPath="yes">

  <iis:WebAppPool
      Id="AppPool"
      Name="OurSite"
      ManagedPipelineMode="Integrated"
      ManagedRuntimeVersion="v4.0"/>

  <iis:WebSite
      Id="Website"
      Description="[WEBSITENAME]"
      Directory="INSTALLDIR">

    <iis:WebApplication
        Id="WebApp"
        Name="[WEBSITENAME]"
        WebAppPool="AppPool"/>

    <!-- if ENV = "DEV" -->
    <iis:WebAddress
        Id="DevHostHeader"
        Header="dev.product.company.com"
        Port="80"/>

    <!-- if ENV = "QA" -->
    <iis:WebAddress
        Id="QaHostHeader"
        Header="qa.product.company.com"
        Port="80"/>

    <iis:WebAddress
        Id="QaHostHeader"
        Header="product.qa1.company.com"
        Port="80"/>

    <!-- if ENV = "PROD" -->
    <iis:WebAddress
        Id="ProdHostHeader"
        Header="prod.product.com"
        Port="80"/>
  </iis:WebSite>
</Component>

<Component/>是条件可以应用的最具体的元素。但是为了指定那里的条件,我必须为每个环境复制我的所有网站auhtoring,对吗?

有没有办法创作<WebAppPool/><WebSite/><WebApplication/>的一个版本,然后{{1}有不同的版本和数量(如上例中的QA)根据属性值的条件插入/选择?

我真的不想为特定环境制作多个版本的安装程序。

谢谢你,
扎卡里

2 个答案:

答案 0 :(得分:3)

您可以通过其他方式解决问题。

您可以拥有一个WebAddress元素,Header属性将获取该属性的值。像这样:

<iis:WebAddress Id="HostHeader" Header="[HOSTHEADER]" Port="80"/>

现在,根据条件(生产,DEV,QA),您可以将属性设置为所需的值,例如,qa.product.company.com用于QA。因此,您将有条件地安装所需的主机头,并在源中保留单个WebAddress条目。请注意,Port属性也可以接受属性值。

答案 1 :(得分:2)

好吧,我想出了如何在没有代码重复的情况下做到这一点......预处理器来救援!

以下是我的“网络服务”目录的简要介绍:

ProductName.WebService.wxs
ProductName.DEV.WebAddress.wxi
ProductName.PROD.WebAddress.wx
ProductName.QA1.WebAddress.wxi

ProductName.WebService.wxs如下:

<Wix
    xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">

  <Fragment>
    <iis:WebDirProperties .../>

    <?foreach EnvID in DEV;PROD;QA1 ?>
    <?define FullEnvID = "ProductName.$(var.EnvID)" ?>

      <?if     $(var.EnvID) = "DEV" ?>
        <?define CompGUID   = "{DFEAC94A-590E-4E92-9206-E574ABDDBB29}" ?>
      <?elseif $(var.EnvID) = "PROD" ?>
        <?define CompGUID   = "{FEE4FBB1-9894-48F4-8DDC-9FC83F8AD778}" ?>
      <?elseif $(var.EnvID) = "QA1" ?>
        <?define CompGUID   = "{EED17AF6-BF99-4B34-821D-6A8487292111}" ?>
      <?endif ?>

      <Component
          Id="$(var.FullEnvID).WebSvc"
          Directory="INSTALLDIR"
          Guid="$(var.CompGUID)"
          KeyPath="yes">
        <Condition><![CDATA[ENV="$(var.EnvID)"]]></Condition>

        <iis:WebAppPool
            Id="$(var.FullEnvID).WebAppPool"
            Name="[WEBSITENAME]"
            ManagedPipelineMode="Integrated"
            ManagedRuntimeVersion="v4.0"/>

        <iis:WebSite
            Id="$(var.FullEnvID).Website"
            Description="[WEBSITENAME]"
            Directory="INSTALLDIR">

          <iis:WebApplication
              Id="$(var.FullEnvID).WebApplication"
              Name="[WEBSITENAME]"
              WebAppPool="$(var.FullEnvID).WebAppPool"/>

          <?include $(var.FullEnvID).WebAddress.wxi ?>
        </iis:WebSite>
      </Component>

      <?undef CompGUID ?>
      <?undef FullEnvID ?>
    <?endforeach ?>
  </Fragment>
</Wix>
  1. <Condition><![CDATA[ENV="$(var.EnvID)"]]></Condition>确定安装了哪个网站组件
  2. <?include $(var.FullEnvID).WebAddress.wxi ?>在循环迭代时只在<iis:WebAddress/>部分中滑动。
  3. 以下是ProductName.DEV.WebAddress.wxi的样子:

    <Include
        xmlns="http://schemas.microsoft.com/wix/2006/wi"
        xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">
      <iis:WebAddress
          Id="dev.product.company.com"
          Header="dev.product.company.com"
          Port="80"/>
    
      <iis:WebAddress
          Id="product.dev.company.com"
          Header="product.dev.company.com"
          Port="80"/>
    </Include>