WIX 安装程序根目录和版本控制

Posted

技术标签:

【中文标题】WIX 安装程序根目录和版本控制【英文标题】:WIX installer root directory and versioning 【发布时间】:2012-03-12 11:56:53 【问题描述】:

我为我的应用程序使用 WIX 创建了一个静默安装程序。我希望它将我的应用程序安装到 C:\MyApps 文件夹,但它的 Directory Id='TARGETDIR' Name='SourceDir' 标签随机选择C 或 D 驱动器。我只想强制安装到 C 盘。此外,如果我提供的版本号大于 4.0.5,我在安装过程中收到错误消息,提示“Windows Installer 服务无法安装此安装包。您必须安装更新版本的 Window Installer 服务。”我正在使用 Windows XP Professional SP3 版本 2002。

【问题讨论】:

能否请您输入定义您的产品版本的代码。在我看来,您定义的是 Windows Installer 版本而不是您的产品版本。 我的产品和包装标签看起来像<Product Name="My Application Name" Id="*" UpgradeCode="FIXED GUID HERE" Language="1033" Version="4.0.6" Manufacturer="ABC"> <Package Id="*" InstallerVersion="406" Compressed="yes" Description="Installer Number 406" />................ 【参考方案1】:

首先,我认为您应该从the tutorial available here 开始您的 WiX 之旅。它包含您在第一件事中将面临的大多数基本问题的答案。您还应该知道,理解 WiX 意味着首先要理解 Windows Installer 的概念 - 否则有些点对您来说似乎是一种奇怪的魔法。

当您在 Visual Studio 中创建一个新的 WiX 安装项目时,它会生成一个带有一些占位符的模板。建议开始修改此模板。比如目录结构:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLLOCATION" Name="SetupProject1">
      <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
      <!-- <Component Id="ProductComponent" Guid="ba7d579f-5234-4448-b880-109f589d58e5"> -->
      <!-- TODO: Insert files, registry keys, and other resources here. -->
      <!-- </Component> -->
    </Directory>
  </Directory>
</Directory>

这个 sn-p 定义了 ProgramFileFolder 下的 INSTALLLOCATION 文件夹,这比将它放在 C:\ 根目录下更好的方法。您仍然可以通过在安装时修改 INSTALLLOCATION 属性来更改安装位置(例如,根据用户的输入)。

您的问题的快速回答是:

...随机选择C盘或D盘...

这是意料之中的 - 它会在安装时选择可用空间最多的驱动器。如果你坚持 WiX 模板默认定义的方式,它将属于 C:(实际上是在 Program Files 文件夹下)。

...您必须安装更新版本的 Window Installer 服务...

基本上,这就是它所说的 - 您计算机上的 Windows Installer 版本低于您在软件包中所需的版本。如果您尝试通过此更改解决上述问题,那么它与 Windows Installer 版本无关。仅当您要使用 Windows Installer 的新功能时,您才应要求高于默认指定的版本。

希望您能从这个简短的介绍中得出正确的结论 - 从教程开始。 :-)

【讨论】:

实际上,安装在 c:\MyApps 目录而不是在程序文件下是客户的需求,而且安装程序必须是无声的,所以没有用户输入我可以设置安装目录位置。我想避免强制所有用户更新他们的 Windows 安装程序包。其他一切都相同,但将版本号更改为 4.0.6 或更高版本的安装程序包的要求。如果提供的版本号为 4.0.5 或更低,则应用程序正在顺利安装。我浏览了教程和各种博客,但找不到太多帮助。非常感谢提前...【参考方案2】:

您的版本的问题是您在更改 Product 版本时更改了 Windows Installer 版本。

<Package
    Id='*' 
    InstallerVersion='406'
    Compressed='yes'
    Description="Installer Number 406" />

InstallerVersion 属性应该是安装此软件包所需的最低要求的 Windows Installer 版本。您已安装 Windows Installer v4.5。当它设置为406 时,它会寻找坦率地说不存在的Windows Installer v4.6。将此设置为301(3.1 版)通常就足够了。

    InstallerVersion='301'

虽然您的描述属性很好,但我会发现以下更有意义:

    Description="My Product v4.0.6 Installer"

【讨论】:

【参考方案3】:

试试这个:

<Fragment>
    <Property Id="_BrowseProperty" Value="INSTALLDIR" Secure="yes"/>
    <CustomAction Id="SetDataLocationDefault" Property="INSTALLDIR" Value="[WindowsVolume]$(var.Title)\" />
    <InstallUISequence>
      <Custom Action="SetDataLocationDefault" After="CostFinalize" />
    </InstallUISequence>
    <InstallExecuteSequence>
      <Custom Action="SetDataLocationDefault" After="CostFinalize" />
    </InstallExecuteSequence>    
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="INSTALLDIR" Name="$(var.Title)">
     <!-- TODO: Insert your components here. -->
      </Directory>
    </Directory>

  </Fragment>

我认为这应该可行!

【讨论】:

【参考方案4】:

不要依赖TARGETDIR,使用自定义属性,像这样:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="INSTALLLOCATION" Name="SetupProject1">
      <!-- TODO: Insert your components here. -->
  </Directory>
</Directory>

模板取自Yan's answer。将INSTALLLOCATION 设置为所需的文件夹C:\MyApps,这样就可以了。

【讨论】:

以上是关于WIX 安装程序根目录和版本控制的主要内容,如果未能解决你的问题,请参考以下文章

WIX:安装应用程序的多个实例并升级应用程序(如果安装在以前安装的位置)

回滚到以前版本的 WiX 捆绑安装程序

Wix 安装程序有选择地卸载以前的版本

WIX:在单独的 cab 文件中升级未版本控制的文件

如何创建将同时安装到 IIS6 和 IIS7 的 WIX 安装程序

无需卸载的 Wix 安装程序升级