views:

443

answers:

3

Hello All,

My company is developing an application that has a dependency on PostgreSQL, we are developping the installer by using WIX. How can we make the PostgreSQL installer (which is also a msi file) run automatically when installing our application? What do we need to set in Wix? If you happen to know any webpage explains this, please post the link. Thank you!

A: 

You can't run two MSI installations at once, you'll need a separate bootstrapper that installs each MSI in turn.

sascha
+3  A: 

One Windows Installer session cannot launch another one, so one msi cannot install another msi. Therefore you need to make a third application, a bootstrapper, which installs both MSI files.

To create such a bootstrapper you can use msbuild's generatebootstrapper task. The wix documentation already covers how to use this task to generate a bootstrapper that installs the .NET framework. See How To: Install the .NET Framework Using a Bootstrapper. This makes use of the pre-defined bootstrapper packages for the .NET framework.

However, in this case you will also have to author your own bootstrapper package for the PostgreSQL msi. One way to do this is to study the existing bootstrapper packages in C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\ (or the ones in the Windows SDK) and read the documentation of the Bootstrapper Manifest XML format. The bootstrapper generator tool might also be helpful.

You might think this is all rather complicated. For a simpler alternative for generating bootstrappers, take a look at dotNetInstaller, which is actually a general purpose bootstrapper generator. It looks slick but I don't have any hands-on experience with it yet.

Wim Coenen
Thanks a lot wcoenen
Ray
+2  A: 

Hi Ray,

Here's a bootstrapper I wrote to add MSXML 6 to one of our installers. The following website was crucial in helping me understand what needed to be done, and might be able to fill in any blanks that you might have: http://msdn.microsoft.com/en-us/library/aa730839%28VS.80%29.aspx

Specifically for your question about getting the installer to run silently, you will need to add the proper switches to the @Arguments attribute of the Command element, which will probably look something like:

<Command PackageFile="PostgreSQL.msi" Arugments="/quiet"/>

You will also need to find the ProductCode of the MSI you are using (using MS Orca) to make sure that the bootstrapper does not try to run the installation if PostgreSQL is already installed:

<InstallChecks>
  <MsiProductCheck 
      Property="IsPostgresInstalled" 
      Product="{PRODUCT-CODE-OF-POSTGRESQL-MSI}"/> 
</InstallChecks>

product.xml:

<Product
    xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
    ProductCode="Microsoft.MSXML.6.SP2">

  <PackageFiles>
    <PackageFile Name="msxml6-KB954459-enu-x86.exe"/>
  </PackageFiles>

  <InstallChecks>
    <MsiProductCheck 
        Property="IsMsiInstalled" 
        Product="{1A528690-6A2D-4BC5-B143-8C4AE8D19D96}"/>
  </InstallChecks>

  <Commands>
    <Command PackageFile="msxml6-KB954459-enu-x86.exe" Arguments="">
      <InstallConditions>
        <BypassIf 
            Property="IsMsiInstalled" 
            Compare="ValueGreaterThan" Value="0"/>
        <FailIf Property="AdminUser" 
                Compare="ValueNotEqualTo" Value="True"
                String="NotAnAdmin"/>
      </InstallConditions> 

      <ExitCodes>
        <ExitCode Value="0" Result="Success"/>
        <ExitCode Value="1641" Result="SuccessReboot"/>
        <ExitCode Value="3010" Result="SuccessReboot"/>
        <DefaultExitCode Result="Fail" String="GeneralFailure"/>
      </ExitCodes>
    </Command>
  </Commands>
</Product>

Here is the project that I run MSBuild with:

<Project ToolsVersion="3.5"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

  <ItemGroup>
    <BootstrapperFile Include="Microsoft.MSXML.6.SP2" >
      <ProductName>Microsoft MSXML 6 SP2</ProductName>
    </BootstrapperFile>
  </ItemGroup>

  <Target Name="setup">
    <GenerateBootstrapper
        ApplicationFile="@PROJECT-EXE@"
        ApplicationName="@PROJECT@"
        BootstrapperItems="@(BootstrapperFile)"
        Path="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper"
        ComponentsLocation="Relative"
        OutputPath="."
        Culture="de"/>
  </Target>

</Project>

I hope this helps.

Zachary Young
Hello Zachary,I really appreciate your help!
Ray