首页 文章

WIX - 如何有选择地卸载<Bundle>

提问于
浏览
1

我想保留以前版本的Bootstrapper App,如何实现这一目标?

我知道我们可以在MSI中使用升级标记,我们可以识别不同版本并根据这些版本执行卸载操作 .

现在,我有一个捆绑应用程序,它有一个或多个使用某些UpgradeCode的MSI . 每次我创建一个新的构建时,我只是对MSI和这个Bundle应用程序进行版本控制 . 当我继续安装更高版本的Bundle App时,它会卸载以前的Bundle版本,这不是我想要的 . 我想保留以前版本的Bundle Application .

在Bundle中还有类似UpgradeVersion的东西,在那里我们可以识别不同的版本并有选择地卸载 .

我的Bundle文件代码片段:

<Bundle Name="myApp"
          Version="1.0.0.0"
          Manufacturer="Myself"
          UpgradeCode="SOME-GUID">

          <BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost" >
          ...
          </BootstrapperApplicationRef>

    <Chain>
      <PackageGroupRef Id= 'WindowsInstaller45'/>
      <PackageGroupRef Id ='NetFx45Offline'/>
      <PackageGroupRef Id ='MY_MSI'/>
    </Chain>
</Bundle>

<Fragment  Id ='PkgFragments'>
<PackageGroup Id ="MY_MSI">
      <MsiPackage SourceFile= "$(var.Installer.TargetPath)"
                  Id="MYAPP"
                  Cache ="yes"
                  Visible ="no"
                  DisplayInternalUI ="no"
                  Permanent="no">
        <MsiProperty Name='INSTALLLOCATION' Value='[InstallFolder]' />
        <MsiProperty Name='SELECT_UNINST' Value='[UninstallPrevVersion]' />
      </MsiPackage>
</PackageGroup>
</Fragment>

我的产品WIX文件代码段

<Product Id="*"
           Name="$(var.ProductName)"
           Version="$(var.ProductVersion)"
           Manufacturer="$(var.ManufacturerName)"
           UpgradeCode="$(var.UpgradeCode)">

    <Property Id="SELECT_UNINST" Secure="yes">1</Property>

    <Upgrade Id="SOME-GUID2">
      <UpgradeVersion Minimum="0.0.0.0" Maximum="$(var.ProductVersion)" IncludeMinimum="yes" IncludeMaximum="yes" Property="UNINSTALL_PREV_VERSION" />
    </Upgrade>

    <CustomAction Id="UninstPrev" Property="UNINSTALL_PREV_VERSION" Value="0" />

    <InstallExecuteSequence>
      <Custom Action="UninstPrev" Before="InstallInitialize"><![CDATA[SELECT_UNINST <> 1]]></Custom>
      <RemoveExistingProducts Overridable="no" After="UninstPrev"></RemoveExistingProducts>
    </InstallExecuteSequence>

</Product>

1 回答

  • 1

    我也会把它作为一个答案 .

    如果您不想删除以前的版本,请不要将新版本视为旧版本的升级 . 这意味着更改升级GUID并更改产品GUID . 如果需要删除特定版本,请将捆绑包作为<RelatedBundle>添加到Bundle定义中,并在Bootstrapper Application中正确处理OnPlanRelatedBundle .

    <RelatedBundle Action="Detect" Id="$(var.ProductVersion622UpgradeGUID)"/>
    

    此外,如果您不希望在"upgrades"之间删除,则您安装的任何msi软件包也需要采用相同的新升级GUID行为 . 保留哪些GUID与哪些已发布版本的列表 . 如果要删除msi发行版中的特定版本,则需要添加

    <Upgrade Id="$(var.Version6InstallerUpgradeGUID)" >
        <UpgradeVersion
            IncludeMaximum ="no"
            IncludeMinimum="yes"
            Maximum="6.0.0.1"
            Minimum="6.0.0.0"
            MigrateFeatures="no"
            Property="V6FOUND"
            OnlyDetect="no" />      
    </Upgrade>
    

    我认为这个要求很奇怪,并且建议你真的考虑一下你是否真的想支持这种行为 .

    另外需要注意的是,现有引导程序的ARP条目并不一定意味着它安装的产品仍在系统中 . 您可以通过始终在OnPlanRelatedBundle中设置 pRequestedState = RequestState.Present; 并将msi包设置为visible = "yes"来进行测试 . 您将在ARP中列出旧的软件包,但它安装的软件包可能是由较新的版本升级的,因此它具有任何意义 . {1493638_ t表示任何内容 .

相关问题