在不卸载/升级其他功能的情况下升级WIX功能树中的单个功能

时间:2009-11-16 18:52:07

标签: wix windows-installer setup-project wix3 feature-upgrade

我正在尝试使用WIX创建一个安装项目,这样我就可以安装单个产品的多个功能。如何更新其中一个已安装的功能(独立于其他已安装的功能),而无需在功能树中重新安装其他功能?

例如,我希望能够拥有一个名为HelloWolrd的项目(返回HelloWolrd),其中(惊喜)打印出“Hello world!”屏幕上。假设我有三个这样的hello world应用程序,Hello World 1,Hello World 2和Hello World 3.每个应用程序都会在屏幕上显示Hello World 1,2或3。我想要的是创建一个MSI,它默认安装所有这三个“功能”,但也允许稍后单独升级每个功能。

以下是我的解决方案布局:

Solution Explorer http://img12.imageshack.us/img12/5671/solutionexplorerm.jpg

My 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 Error http://img696.imageshack.us/img696/849/anotherversionisinstall.jpg

我更新了我的代码以允许卸载这些功能并允许使用升级代码,但是已经卸载了所有功能,并重新安装了所有这些功能。


- 真实世界的应用程序 -

真实世界的应用程序是一个大型软件包,需要多个支持应用程序,这些应用程序定期作为服务/计划任务运行。我想将这些支持应用程序安装到一个MSI中,这样我们就不会有单独推出每个exe的噩梦。我知道如果我们对exe之一进行了更新,我们可以手动编译该exe并将其推出,但我想以完全可重现的方式执行此操作。

任何帮助都会得到满足,

谢谢!

编辑:

我从Google Code添加了下载源代码。再次感谢!

2 个答案:

答案 0 :(得分:12)

答案 1 :(得分:0)

听起来你想出了升级方案,现在你只需要找出Where to place RemoveExistingProducts in a major MSI upgrade,这样如果功能没有改变就不会重新安装:)