如何在WIX中安装期间静默运行另一个程序(PostgreSQL)的安装程序?

时间:2009-12-28 20:29:21

标签: wix installer executable

我的公司正在开发一个依赖PostgreSQL的应用程序,我们正在使用WIX开发安装程序。我们如何在安装应用程序时自动运行PostgreSQL安装程序(也是一个msi文件)?我们需要在Wix中设置什么?如果您碰巧知道任何网页解释了这一点,请发布链接。谢谢!

3 个答案:

答案 0 :(得分:4)

这是我写的一个引导程序,用于将MSXML 6添加到我们的一个安装程序中。以下网站对于帮助我了解需要完成的工作至关重要,并且可以填写您可能拥有的任何空白: http://msdn.microsoft.com/en-us/library/aa730839%28VS.80%29.aspx

特别是关于让安装程序以静默方式运行的问题,您需要将正确的开关添加到Command元素的@Arguments属性中,这可能类似于:

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

您还需要找到您正在使用的MSI的ProductCode(使用MS Orca),以确保如果已安装PostgreSQL,则引导程序不会尝试运行安装:

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

这是我运行MSBuild的项目:

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

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

我希望这会有所帮助。

答案 1 :(得分:3)

一个Windows Installer会话无法启动另一个会话,因此一个msi无法安装另一个msi。因此,您需要创建第三个应用程序,即一个安装两个MSI文件的引导程序。

要创建这样的引导程序,您可以使用msbuild的generatebootstrapper task。 wix文档已经介绍了如何使用此任务生成安装.NET框架的引导程序。见How To: Install the .NET Framework Using a Bootstrapper。这使用了.NET框架的预定义引导程序包。

但是,在这种情况下,您还必须为PostgreSQL msi创建自己的引导程序包。一种方法是研究C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\中的现有引导程序包(或Windows SDK中的引导程序包)并阅读documentation of the Bootstrapper Manifest XML formatbootstrapper generator工具也可能会有所帮助。

你可能认为这一切都很复杂。有关生成引导程序的更简单的替代方法,请查看dotNetInstaller,它实际上是一个通用的引导程序生成器。它看起来很光滑,但我还没有任何亲身体验。

答案 2 :(得分:0)

您不能同时运行两个MSI安装,您需要一个单独的引导程序来依次安装每个MSI。