Как установить несколько веб-адресов условно? - PullRequest
2 голосов
/ 11 октября 2011

У меня есть веб-сайт, который я устанавливаю для одного из наших внутренних продуктов, и хотел бы знать, есть ли способ настроить несколько блоков <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/> на основе условие значения свойства?

Я действительно не хочу создавать несколько версий установщика для конкретной среды.

Спасибо,
Zachary

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Вы можете подойти к проблеме по-другому.

У вас может быть один элемент WebAddress , а атрибут Header примет значение свойства.Например:

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

Теперь, основываясь на условии (production, DEV, QA), вы задаете для свойства требуемое значение, например, qa.product.company.com для QA.Таким образом, вы условно установите нужный заголовок хоста и сохраните в источниках одну запись WebAddress.Обратите внимание, что атрибут Port также может принимать значения свойств.

2 голосов
/ 22 октября 2011

Ну, я разобрался, как это сделать без дублирования кода ... препроцессор на помощь!

Вот упрощенный взгляд на мою директорию "веб-сервисов":

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>
...