2

我有一个要为我们的一个内部产品安装的网站,并且想知道是否有一种方法可以设置多个<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/>是条件可以应用于的最具体的元素。但是为了在那里指定条件,我必须为每个环境复制我所有的网站作者,对吗?

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

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

谢谢你,
扎卡里

4

2 回答 2

3

你可以用不同的方式来解决这个问题。

您可以有一个WebAddress元素,并且该Header属性将采用该属性的值。像这样:

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

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

于 2011-10-11T05:44:44.927 回答
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/>当循环迭代时,只在部分中滑动。

如下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>
于 2011-10-21T21:27:27.270 回答