WiX - Burn 支持两用 msi 包吗?

Posted

技术标签:

【中文标题】WiX - Burn 支持两用 msi 包吗?【英文标题】:WiX - Does Burn support dual-purpose msi packages? 【发布时间】:2014-05-12 10:07:02 【问题描述】:

Burn 是否支持根据these Microsoft guidelines 准备的双用途(每用户或每机器)MSI 包?

我尝试准备这样的包,但使用 Burn 创建的引导程序似乎没有卸载 MSI 包,该包是在最终用户提高 UAC 权限后按计算机安装的。

Burn的源码是:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
       xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
  <Bundle Version="1.0" 
              Name="AppNameHere"
          UpgradeCode="GuidHere">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense" >
      <bal:WixStandardBootstrapperApplication LicenseUrl=""
                                              SuppressOptionsUI="yes" 
                                              ThemeFile="Customization\Theme.xml"
                                              LocalizationFile="Customization\LangHere.wxl"/>
    </BootstrapperApplicationRef>
    <Chain>
      <PackageGroupRef Id="WindowsInstaller45"/>
      <PackageGroupRef Id="NetFx40ClientRedist"/>  <!-- Uzywa rozszerzenia WixNetfxExtension do zainstalowania .net -->
      <PackageGroupRef Id="vcredist"/>
      <MsiPackage Compressed="yes" 
                  SourceFile="MsiFileNameHere"
                  DisplayInternalUI="yes">
        <MsiProperty Name="UPDATEDIR" Value="[UninstallPath]"/>
        <MsiProperty Name="WIXBUNDLEKEY" Value="[WixBundleProviderKey]"/>
      </MsiPackage>
        </Chain>
  </Bundle>
  <Fragment>
    <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86" Value="Installed" Variable="vcredistkeyx86" /> 
    <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\x86" Value="Installed" Variable="vcredistkeyx64" /> 
    <PackageGroup Id="vcredist">
        <ExePackage Id="vcredist_x86" 
                    Cache="no" 
                    Compressed="yes" 
                    PerMachine="yes" 
                    Permanent="yes" 
                    Vital="yes" 
                    SourceFile="Components\vcredist_x86.exe"
                    DetectCondition="(vcredistkeyx86 AND (vcredistkeyx86 &gt;= 1)) OR (vcredistkeyx64 AND (vcredistkeyx64 &gt;= 1))" />
    </PackageGroup>
    <PackageGroup Id="WindowsInstaller45">
      <ExePackage Cache="no" 
                  Compressed="yes" 
                  PerMachine="yes" 
                  Permanent="yes" 
                  Vital="yes"
                  SourceFile="Components\WindowsXP-KB942288-v3-x86.exe"
                  InstallCondition="VersionNT=v5.1 AND NOT VersionNT64 AND VersionMsi &lt; v4.5"
                  InstallCommand="/quiet /norestart">
        <ExitCode Behavior="forceReboot"/>
      </ExePackage>      
    </PackageGroup>
  </Fragment>  
</Wix>

【问题讨论】:

您能否提供一些源代码,其中 MSI 包在引导程序中声明? 我通过 Burn 的源代码扩展了帖子。 【参考方案1】:

从 WIX V3.9 开始,答案是合格的“否”——Burn 目前不支持双用途的每用户或每机器 MSI 包。

双用途 MSI 程序包的 ALLUSERS 属性设置为“2”。当您构建引用此类 MSI 包的 WIX 引导程序项目时,您应该会看到此类警告:

2>D:\Robert\Documents\Visual Studio 2013\Projects\BurnTest\Bootstrapper\Bundle.wxs(18,0):警告 LGHT1133:捆绑包要求每个机器或每个用户都有一个包。 MSI 'D:\Robert\Documents\Visual Studio 2013\Projects\BurnTest\SetupProject\bin\Release\SetupProject.msi' ALLUSERS 属性设置为 '2' 可能会在安装时从每个用户更改为每台机器. Bundle 将假定包是每台机器的,如果更改将无法正常工作。如果可能,请删除 Id='ALLUSERS' 的属性并改用 Package/@InstallScope 属性。

WIX 引导程序项目的构建过程将尝试从链接的包中确定要创建哪种类型的刻录安装(每用户或每台机器)。逻辑很复杂,因为您可以在不同的地方声明每个用户或每台机器的首选项,以及链接包之间的潜在冲突。但总体思路是,burn 编译器将生成每台机器的安装,除非其中一个链接的包是每用户的,这会将 Burn 安装转换为每用户模式。关键点是在构建时决定创建每用户或每机器包。要正确支持双重用途的 MSI 软件包,需要将决定移至安装时间。

【讨论】:

尽管如此,这是 Burn 的一个严重缺点。它阻止我们使用它(我们已经退出了由 VisualStudio 构建的引导程序)。在我们的例子中,我们通常希望我们的软件以每台机器模式安装,但如果最终用户没有管理权限,我们希望允许他以每用户模式安装。

以上是关于WiX - Burn 支持两用 msi 包吗?的主要内容,如果未能解决你的问题,请参考以下文章

Wix burn 正在降级我的 msi 包

WiX 自定义操作在 MSI 中使用 [SourceDir] 和 Burn

强制 WiX Burn 引导程序允许 MSI 文件使用 REINSTALLMODE=amus

我可以使用 WiX 创建一个 MSI 来升级使用 Burn Bootstrapper 安装的应用程序吗?

自定义 WiX Burn 引导程序用户界面?

Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序