我正在尝试使用WIX创建一个安装项目,该项目将允许我安装单个产品的多个功能。如何更新已安装的功能之一(独立于其他已安装的功能)而无需重新安装功能树中的其他功能?
例如,我希望能够有一个名为 HelloWolrd 的项目(回到 HelloWolrd),它(惊喜)打印“Hello world!” 屏幕上。假设我有三个 hello world 应用程序,Hello World 1、Hello World 2 和 Hello World 3。每一个都分别在屏幕上打印 Hello World 1、2 或 3。我想要的是创建一个 MSI,它默认安装所有这三个“功能”,但也允许以后单独升级每个功能。
这是我的解决方案的布局:
解决方案资源管理器 http://img12.imageshack.us/img12/5671/solutionexplorerm.jpg
我的 WIX Product.wxs 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="ca484210-c719-4b2e-b960-45212d407c11" Name="HelloWorldInstaller" Language="1033" Version="1.0.0.0" Manufacturer="HelloWorldInstaller" UpgradeCode="68eeb8cb-9ef3-443c-870c-9b406129f7ff">
<Package InstallerVersion="200" Compressed="yes" />
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<!-- Create Directory Structure -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="Hello World" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop"/>
</Directory>
<DirectoryRef Id="INSTALLLOCATION">
<Component Id="HelloWorld1" Guid="6D1D9D33-DA17-4db3-8132-C39F32200C3A">
<RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld1\Install" Action="createAndRemoveOnUninstall">
<RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<File Id="HelloWorld1.exe" Name="$(var.HelloWorld1.TargetFileName)" Source="$(var.HelloWorld1.TargetPath)" DiskId="1" Checksum="yes">
<Shortcut Id="HelloWorld1ApplicationDesktopShortcut" Name="Hello World 1" Description="Hello World Application 1" Directory="DesktopFolder" WorkingDirectory="INSTALLLOCATION" />
</File>
</Component>
<Component Id="HelloWorld2" Guid="B2D51F85-358B-41a7-8C45-B4BB341158F8">
<RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld2\Install" Action="createAndRemoveOnUninstall">
<RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<File Id="HelloWorld2.exe" Name="$(var.HelloWorld2.TargetFileName)" Source="$(var.HelloWorld2.TargetPath)" DiskId="1" Checksum="yes">
<Shortcut Id="HelloWorld2ApplicationDesktopShortcut" Name="Hello World 2" Description="Hello World Application 2" Directory="DesktopFolder" WorkingDirectory="INSTALLLOCATION" />
</File>
</Component>
<Component Id="HelloWorld3" Guid="A550223E-792F-4169-90A3-574D4240F3C4">
<RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld3\Install" Action="createAndRemoveOnUninstall">
<RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<File Id="HelloWorld3.exe" Name="$(var.HelloWorld3.TargetFileName)" Source="$(var.HelloWorld3.TargetPath)" DiskId="1" Checksum="yes">
<Shortcut Id="HelloWorld3ApplicationDesktopShortcut" Name="Hello World 3" Description="Hello World Application 3" Directory="DesktopFolder" WorkingDirectory="INSTALLLOCATION" />
</File>
</Component>
</DirectoryRef>
<Feature Id="HelloWorld1Feature" Title="Hello World 1" Level="1">
<ComponentRef Id="HelloWorld1"/>
</Feature>
<Feature Id="HelloWorld2Feature" Title="Hello World 2" Level="1">
<ComponentRef Id="HelloWorld2"/>
</Feature>
<Feature Id="HelloWorld3Feature" Title="Hello World 3" Level="1">
<ComponentRef Id="HelloWorld3"/>
</Feature>
</Product>
</Wix>
现在,当它被构建时,它会按照您的预期安装功能。但是,当您对 HelloWorld1.vb 进行修改并重新编译时,我希望它能够仅重新安装(升级)该功能,而不是全部。
当我更新一个文件并重建解决方案,然后尝试安装 msi 时,我收到此错误:
MSI 错误 http://img696.imageshack.us/img696/849/anotherversionisinstall.jpg
我更新了我的代码以允许卸载功能并允许使用升级代码,但是卸载了所有功能并重新安装了所有功能。
-- 实际应用 --
现实世界的应用程序是一个大型软件包,需要多个支持应用程序作为服务/计划任务定期运行。我希望将这些支持应用程序安装到一个 MSI 中,这样我们就不会遇到单独推出每个 exe 的噩梦。我知道,如果我们对其中一个 exe 进行了更新,我们可以手动编译该 exe 并将其推出,但我想以完全可重现的方式执行此操作。
任何帮助都会得到帮助,
谢谢!
编辑:
我添加了从Google Code下载的源代码。再次感谢!