2012-02-01 16 views
12

Ho un progetto di installazione WiX che include le impostazioni di IIS per la directory virtuale e le impostazioni dell'applicazione con un pool di applicazioni. Dopo l'installazione iniziale, il cliente modifica l'identità del pool di applicazioni dal set di servizi di rete predefinito in wxs.Installazione di applicazioni Web con impostazioni IIS iniziali; utilizzando WiX, è necessario aggiornare i file, NON modificare le impostazioni di IIS

Come è possibile creare un programma di installazione di aggiornamento in grado di aggiornare i file Web, ma non modificare le impostazioni IIS, l'identità del pool di applicazioni sul servizio di rete?

ComponentGroupRef Id = "WebPublishCmp" è l'emissione di calore iniziale dei file Web da pubblicare.

ho cercato di costruire un aggiornamento minore utilizzando Torch e Pyro, ma sto avendo problemi con la torcia non diff rilevare i cambiamenti (questo è un altro problema per un altro Stack Overflow   domanda).

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
    xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension"> 

    <?include Config.wxi ?> 

    <Product 
    Id="E3105F82-0460-4C3C-8F6C-778405E81F61" 
    Name="Website" 
    Language="1033" 
    Version="1.0.0.1" 
    Manufacturer="Website" 
    UpgradeCode="E3105F82-0460-4C3C-8F6C-778405E81F61"> 

    <Package 
     InstallerVersion="200" Compressed="yes" /> 

    <Media 
     Id="1" 
     Cabinet="media1.cab" 
     EmbedCab="yes" /> 

    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" /> 
    <UIRef Id="CustomWixUI_InstallDir"/> 

    <FeatureRef Id="InitialFeature"/> 

    </Product> 

    <Fragment> 
    <Feature Id="InitialFeature" Title="Initial (Full)" Level="1"> 
     <ComponentGroupRef Id="WebPublishCmp"/> 
     <ComponentRef Id="IIS.Component"/> 
    </Feature> 

    <Feature Id="WebFilesFeature" Title="Website (Files)" Level="1"> 
     <ComponentGroupRef Id="WebPublishCmp"/> 
    </Feature> 


    </Fragment> 

    <Fragment> 
    <Component Id="IIS.Component" Guid="6FAD9EC7-D2B0-4471-A657-C8AF5F6F707F" KeyPath="yes" Directory="INSTALLLOCATION"> 
     <iis:WebSite Id="DefaultWebSite" Description="$(var.WebSiteName)" Directory="INSTALLLOCATION" > 
     <iis:WebAddress Id="AllUnassigned" Port="80"/> 
     </iis:WebSite> 
     <iis:WebAppPool Id="WebsiteAppPool" Name="App" Identity="networkService" /> 
     <iis:WebVirtualDir Id="My.VirtualDir" Alias="App" Directory="INSTALLLOCATION" WebSite="DefaultWebSite"> 
     <iis:WebApplication Id="Application" Name="App" WebAppPool="WebsiteAppPool"/> 
     </iis:WebVirtualDir> 
    </Component> 
    </Fragment> 

    <Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
     <Directory Id="INSTALLLOCATION" Name="Website"> 
     </Directory> 
     </Directory> 
    </Directory> 
    </Fragment> 
</Wix> 

sto usando:

  • WiX 3.5, 3.6
  • Visual Studio 2010

risposta

34

mi scuso in anticipo per la risposta lunga:

Mi consiglia di mantenere il tuo sito web e il contenuto in due funzioni distinte e quindi dando loro la possibilità di fornire qualsiasi variabile necessaria per l'installazione tramite interfaccia utente o parametri della riga di comando. Se si utilizza "Remember Property" pattern, è possibile richiamare le variabili utilizzate durante la modifica o l'aggiornamento di un'installazione (consultando tutti gli ultimi commenti, esiste un modo leggermente più semplice di farlo).

Ciò consente alla persona che installa il prodotto di configurare tutto con le variabili specificate o di configurare autonomamente il sito Web IIS e installare solo il contenuto del sito Web.

Anche questo funziona bene con MajorUpgrades. Io attualmente non vedo aggiornare le informazioni nel codice che hai fornito, così si dovrebbe guardare in MajorUpgrades vs patches (importanti aggiornamenti sono molto più facili)

<MajorUpgrade AllowDowngrades="no" AllowSameVersionUpgrades="yes" Schedule="afterInstallInitialize" DowngradeErrorMessage="A later version of of this product is already installed. Setup will now exit."/> 

Ricordate, le variabili a cui si accede da $ (var.name) sono utilizzati al MSI tempo di compilazione , mentre le variabili pubbliche a cui si accede tramite parentesi [MY_VARIABLE] vengono utilizzate al momento dell'installazione. Le variabili pubbliche possono essere esposti attraverso il MSI interfaccia utente, o forniti al msiexec tramite linea di comando (io uso questo per installazioni invisibili e/o specificare un file di log)

Ecco una sintesi degli esempi riportato qui di seguito:

  • Configuration.wxi - Questo file implementa i "ricordati" proprietà
  • Product.wxs - per lo più come la vostra, ma include anche MajorUpgrades, funzioni separate per il sito web e il contenuto, e un inserimento del UiFlow
  • IISConfiguration.wxs - Un frammento contenente il sito Web IIS, AppPool e l'utente AppPool utilizzando le variabili fornite al momento dell'installazione
  • UIFlow.WXS - Definire il flusso dell'interfaccia utente da utilizzare, che sta utilizzando il plugin WixUI FeatureTree, si può richiedere qualcosa di diverso per la vostra interfaccia utente
  • UIDialogs.wxs - Questo è dove le variabili utilizzate nel montaggio sono esposti alla UI

Configuration.wxi:

<?xml version="1.0" encoding="utf-8" ?> 
<Include xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension" 
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"> 

    <!-- The RegistrySearch elements will populate these properties with values from the registry IF they exist there, otherwise the default values will be used --> 
    <Property Id="REG_WEBSITE_NAME" Value="WebsiteName" > 
     <RegistrySearch Id="WEB_WEBSITE_NAME_Remembered" Root="HKLM" Key="SOFTWARE\PRODUCT_NAME" Name="Website_Name" Type="raw" /> 
    </Property> 
    <Property Id="REG_WEB_APP_POOL_NAME" Value="PoolName" > 
     <RegistrySearch Id="WEB_APP_POOL_NAME_Remembered" Root="HKLM" Key="SOFTWARE\PRODUCT_NAME" Name="WebApp_PoolName" Type="raw" /> 
    </Property> 
    <Property Id="REG_WEB_APP_POOL_IDENTITY_DOMAIN"> 
     <RegistrySearch Id="WEB_APP_POOL_IDENTITY_DOMAIN_Remembered" Root="HKLM" Key="SOFTWARE\PRODUCT_NAME" Name="WebApp_PoolIdentityDomain" Type="raw" /> 
    </Property> 
    <Property Id="REG_WEB_APP_POOL_IDENTITY_USERNAME" Value="NetworkService" > 
     <RegistrySearch Id="WEB_APP_POOL_IDENTITY_USERNAME_Remembered" Root="HKLM" Key="SOFTWARE\PRODUCT_NAME" Name="WebApp_PoolIdentityUsername" Type="raw" /> 
    </Property> 
    <!-- Notice that the password is NOT stored in the registry and is hidden so it's not shown in logs --> 
    <Property Id="WEB_APP_POOL_IDENTITY_PWD" Hidden="yes" /> 

    <!-- This is the compnent that actually writes the values to the registry on install --> 
    <Component Id="C_RegistryEntries" Directory="INSTALLLOCATION"> 
     <RegistryValue Root="HKLM" Key="SOFTWARE\ProviderWebsites" Name="Website_Name"     Type="string" Value="[WEBSITE_NAME]"/> 
     <RegistryValue Root="HKLM" Key="SOFTWARE\ProviderWebsites" Name="WebApp_PoolName"    Type="string" Value="[WEB_APP_POOL_NAME]"/> 
     <RegistryValue Root="HKLM" Key="SOFTWARE\ProviderWebsites" Name="WebApp_PoolIdentityDomain"  Type="string" Value="[WEB_APP_POOL_IDENTITY_DOMAIN]"/> 
     <RegistryValue Root="HKLM" Key="SOFTWARE\ProviderWebsites" Name="WebApp_PoolIdentityUsername" Type="string" Value="[WEB_APP_POOL_IDENTITY_USERNAME]"/> 
    </Component> 

    <!-- These CustomActions set the property that are used for the install from the registry values (These actions are only run under the conditions in the sequences below) --> 
    <CustomAction Id='SetWebAppName'     Property='WEBSITE_NAME'      Value='[REG_WEBSITE_NAME]'/> 
    <CustomAction Id='SetWebAppPoolName'    Property='WEB_APP_POOL_NAME'    Value='[REG_WEB_APP_POOL_NAME]'/> 
    <CustomAction Id='SetWebAppPoolIdentityDomain'  Property='WEB_APP_POOL_IDENTITY_DOMAIN'  Value='[REG_WEB_APP_POOL_IDENTITY_DOMAIN]'/> 
    <CustomAction Id='SetWebAppPoolIdentityUsername' Property='WEB_APP_POOL_IDENTITY_USERNAME' Value='[REG_WEB_APP_POOL_IDENTITY_USERNAME]'/> 

    <!-- The CustomActions above that set the variables used in the installation are only run if they were not supplied by the command line --> 
    <InstallUISequence> 
     <Custom Action='SetWebAppName'     After='AppSearch'>REG_WEBSITE_NAME      AND (NOT WEBSITE_NAME)</Custom> 
     <Custom Action='SetWebAppPoolName'    After='AppSearch'>REG_WEB_APP_POOL_NAME     AND (NOT WEB_APP_POOL_NAME)</Custom> 
     <Custom Action='SetWebAppPoolIdentityDomain' After='AppSearch'>REG_WEB_APP_POOL_IDENTITY_DOMAIN  AND (NOT WEB_APP_POOL_IDENTITY_DOMAIN)</Custom> 
     <Custom Action='SetWebAppPoolIdentityUsername' After='AppSearch'>REG_WEB_APP_POOL_IDENTITY_USERNAME AND (NOT WEB_APP_POOL_IDENTITY_USERNAME)</Custom> 
    </InstallUISequence> 
    <InstallExecuteSequence> 
     <!-- After='RemoveExistingProducts' is used under this sequence because of the use of MajorUpgrades --> 
     <Custom Action='SetWebAppName'     After='RemoveExistingProducts'>REG_WEBSITE_NAME      AND (NOT WEBSITE_NAME)</Custom> 
     <Custom Action='SetWebAppPoolName'    After='RemoveExistingProducts'>REG_WEB_APP_POOL_NAME     AND (NOT WEB_APP_POOL_NAME)</Custom> 
     <Custom Action='SetWebAppPoolIdentityDomain' After='RemoveExistingProducts'>REG_WEB_APP_POOL_IDENTITY_DOMAIN  AND (NOT WEB_APP_POOL_IDENTITY_DOMAIN)</Custom> 
     <Custom Action='SetWebAppPoolIdentityUsername' After='RemoveExistingProducts'>REG_WEB_APP_POOL_IDENTITY_USERNAME AND (NOT WEB_APP_POOL_IDENTITY_USERNAME)</Custom> 
    </InstallExecuteSequence> 

</Include> 

Product.wxs:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension" 
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"> 

    <!--NEVER EVER EVER EVER CHANGE THE UPGRADE CODE!!!!!!!!!!!!!!! --> 
    <?define UpgradeCode="PUT-GUID-HERE" ?> 

    <Product Id="*" Name="ProductName" Language="1033" Version="X.X.X.X" Manufacturer="XYZ" UpgradeCode="$(var.UpgradeCode)"> 
     <Package InstallerVersion="200" Compressed="yes" /> 

     <!-- This includes our properties that implement the "Remember Property" pattern --> 
     <?include Configuration.wxi ?> 

     <Media Id="1" Cabinet="media.cab" EmbedCab="yes" /> 

     <MajorUpgrade AllowDowngrades="no" AllowSameVersionUpgrades="yes" Schedule="afterInstallInitialize" 
         DowngradeErrorMessage="A later version of this product is already installed. Setup will now exit."/> 

     <!-- Creating default directory structure (INSTALLLOCATION be override by user, but it starts in Program Files) --> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id='ProgramFilesFolder' Name='PFiles'> 
       <Directory Id="INSTALLLOCATION" Name="TheDefaultInstallFolderName"> 

       </Directory> 
      </Directory> 
     </Directory> 

     <Feature Id="F_Content" Title="Content" Level="1" Description="The website content" ConfigurableDirectory="INSTALLLOCATION"> 
      <ComponentRef Id="C_RegistryEntries"/> 
      <!-- The C_WebAppContent can either be generated by the WiX tool "heat", or a hand-crafted set of content, this component is not included in this example --> 
      <ComponentGroupRef Id="C_WebAppContent" /> 
     </Feature> 

     <Feature Id="F_IISWebsite" Title="IIS Website" Description="The IIS website and application pool" Level="1"> 
      <ComponentRef Id="C_IISWebsite" /> 
     </Feature> 

     <InstallExecuteSequence> 
     </InstallExecuteSequence> 

     <!-- Specify UI --> 
     <UIRef Id="UIFlow" /> 
    </Product> 
</Wix> 

IISConfiguration.wxs:

<?xml version="1.0" encoding="utf-8" ?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension" 
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> 

    <Fragment>  
     <DirectoryRef Id="INSTALLLOCATION"> 
      <Component Id="C_IISWebsite" Guid="{PUT-GUID-HERE}" KeyPath="yes"> 
       <!-- This does not create a user, it's just an object that's referenced by the WebAppPool component --> 
       <util:User Id="WebAppPoolUser" CreateUser="no" Name="[WEB_APP_POOL_IDENTITY_USERNAME]" 
          Password="[WEB_APP_POOL_IDENTITY_PWD]" Domain="[WEB_APP_POOL_IDENTITY_DOMAIN]"/> 

       <!-- The "Identity" attritbute below needs to be set to "other" to use the util:User defined above --> 
       <iis:WebAppPool Id="WebAppPool" Name="[WEB_APP_POOL_NAME]" Identity="other" User="WebAppPoolUser"/> 

       <iis:WebSite Id="DefaultWebSite" Description="[WEBSITE_NAME]" Directory="INSTALLLOCATION" > 
        <iis:WebAddress Id="AllUnassigned" Port="80"/> 
       </iis:WebSite> 

       <iis:WebVirtualDir Id="My.VirtualDir" Alias="App" Directory="INSTALLLOCATION" WebSite="DefaultWebSite"> 
        <iis:WebApplication Id="Application" Name="App" WebAppPool="WebAppPool"/> 
       </iis:WebVirtualDir> 
      </Component> 
     </DirectoryRef> 
    </Fragment> 
</Wix> 

UIFlow.wxs:

<?xml version="1.0" encoding="utf-8" ?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <UI Id="UIFlow"> 
      <!-- This uses the WixUI plugin --> 
      <UIRef Id="WixUI_FeatureTree" /> 
      <UIRef Id="WixUI_ErrorProgressText" /> 

      <!-- Injection of custom UI. --> 
      <DialogRef Id="IisSetupDlg" /> 

      <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="IisSetupDlg" Order="3">LicenseAccepted = "1"</Publish> 
      <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="PoolSettingsDlg">1</Publish> 
     </UI> 
    </Fragment> 
</Wix> 

UIDialogs.wxs:

<?xml version="1.0" encoding="utf-8" ?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <UI> 
      <Dialog Id="IisSetupDlg" Width="370" Height="270" Title="IIS Settings - [ProductName]" NoMinimize="yes">     
       <!-- Web App details prompt --> 
       <Control Id="WebsiteNameLabel" Type="Text" X="45" Y="53" Width="100" Height="15" TabSkip="no" Text="&amp;Website Name:" /> 
       <Control Id="WebsiteNameEdit" Type="Edit" X="45" Y="65" Width="220" Height="18" Property="WEBSITE_NAME" Text="{80}" /> 

       <!-- Back button --> 
       <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="&amp;Back"> 
        <Publish Event="NewDialog" Value="LicenseAgreementDlg">1</Publish> 
       </Control> 

       <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="&amp;Next"> 
        <Publish Event="NewDialog" Value="PoolSettingsDlg"> 
         <!--if settings are correct, allow next dialog--> 
         <![CDATA[WEBSITE_NAME <> ""]]> 
        </Publish> 
       </Control> 

       <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="Cancel"> 
        <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish> 
       </Control> 

       <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="WixUI_Bmp_Banner" /> 
       <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes"> 
        <Text>Please enter IIS Configuration</Text> 
       </Control> 

       <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" /> 
       <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes"> 
        <Text>{\WixUI_Font_Title}IIS Settings</Text> 
       </Control> 

       <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" /> 
      </Dialog> 

      <Dialog Id="PoolSettingsDlg" Width="370" Height="300" Title="Application Pool Settings - [ProductName]" NoMinimize="yes"> 
       <!-- name of the application pool --> 
       <Control Id="PoolNameLabel" Type="Text" X="45" Y="53" Width="100" Height="15" TabSkip="no" Text="&amp;Pool name:" /> 
       <Control Id="PoolNameEdit" Type="Edit" X="45" Y="65" Width="220" Height="18" Property="WEB_APP_POOL_NAME" Text="{80}" /> 

       <!-- domain --> 
       <Control Id="DomainPoolLabel" Type="Text" X="45" Y="85" Width="100" Height="15" TabSkip="no" Text="&amp;Domain for AppPool:" /> 
       <Control Id="DomainPoolEdit" Type="Edit" X="45" Y="97" Width="220" Height="18" Property="WEB_APP_POOL_IDENTITY_DOMAIN" Text="{80}" /> 

       <!-- Login --> 
       <Control Id="LoginPoolLabel" Type="Text" X="45" Y="117" Width="100" Height="15" TabSkip="no" Text="&amp;Login for AppPool:" /> 
       <Control Id="LoginPoolEdit" Type="Edit" X="45" Y="129" Width="220" Height="18" Property="WEB_APP_POOL_IDENTITY_USERNAME" Text="{80}" /> 

       <!-- Password --> 
       <Control Id="PasswordPoolLabel" Type="Text" X="45" Y="149" Width="100" Height="15" TabSkip="no" Text="&amp;Password for AppPool:" /> 
       <Control Id="PasswordPoolEdit" Type="Edit" X="45" Y="161" Width="220" Height="18" Property="WEB_APP_POOL_IDENTITY_PWD" Text="{80}" Password="yes" /> 

       <!-- Back button --> 
       <Control Id="Back" Type="PushButton" X="180" Y="264" Width="56" Height="17" Text="&amp;Back"> 
        <Publish Event="NewDialog" Value="IisSetupDlg">1</Publish> 
       </Control> 
       <Control Id="Next" Type="PushButton" X="236" Y="264" Width="56" Height="17" Default="yes" Text="&amp;Next"> 
        <Publish Event="NewDialog" Value="CustomizeDlg"> 
         <!--if settings are correct, allow next dialog--> 
         <![CDATA[WEB_APP_POOL_NAME <> "" 
           or WEB_APP_POOL_IDENTITY_DOMAIN <> "" 
           or WEB_APP_POOL_IDENTITY_USERNAME <> "" 
           or WEB_APP_POOL_IDENTITY_PWD <> ""]]> 
        </Publish> 
       </Control> 

       <Control Id="Cancel" Type="PushButton" X="304" Y="264" Width="56" Height="17" Cancel="yes" Text="Cancel"> 
        <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish> 
       </Control> 

       <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="WixUI_Bmp_Banner" /> 
       <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes"> 
        <Text>Please enter AppPool Configuration for IIS</Text> 
       </Control> 

       <Control Id="BottomLine" Type="Line" X="0" Y="255" Width="370" Height="0" /> 
       <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes"> 
        <Text>{\WixUI_Font_Title}Application Pool Settings</Text> 
       </Control> 

       <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" /> 
      </Dialog> 
     </UI> 
    </Fragment> 
</Wix> 
+0

E 'un buon esempio, ma hanno bisogno di cancellare questi file in UIFlow.wxs

+0

È possibile installare Cassini e distribuire il file su di esso utilizzando Wiz? –

+0

Questo non richiede che l'utente che installa aggiorni la password ogni volta che aggiorna il prodotto? –

Problemi correlati