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:安装应用程序的多个实例并升级应用程序(如果安装在以前安装的位置)