在 Wix 包中使用时如何防止重复安装 Miniconda?

How to prevent duplicate installation of Miniconda when used in a Wix bundle?

我正在开发调用 python 脚本的 .NET 应用程序(及其安装程序)。为此,不仅需要安装应用程序,还需要安装 Miniconda。但是,当应用程序有更新时,Miniconda 已经可用时不应再次安装。

我试图实现它,但我没有成功。这是我的 Bundle.wxs(我使用的是 Wix 3.11)。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

    <?include ..\InstallPlugin\Forwards.wxi?>

    <Bundle
        Name="$(var.ProductTitle)"
        Version="$(var.ProductVersion)"
        Manufacturer="$(var.ProductCompany)"
        Copyright="$(var.ProductCopyright)"
        DisableModify="yes"
        DisableRemove="yes"
        IconSourceFile="../Images/Icon.ico"
        UpgradeCode="f8b6f347-2832-41c9-9d89-112144f62ed8"
        >

        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkSidebarLicense">
            <Payload SourceFile="..\Deployment\Bootstrapper\bin\Release\net462\Bootstrapper.dll"/>
            <Payload Name="BootstrapperCore.config" SourceFile="..\Deployment\Bootstrapper\Bootstrapper.BootstrapperCore.config"/>
            <Payload Name="en-US\License.rtf" SourceFile="../Licenses/License.en-US.rtf"/>
            <Payload SourceFile="../Images/Logo.png"/>
            <bal:WixStandardBootstrapperApplication
                LicenseUrl="https://SOMETHING"
                ShowVersion="yes" />
        </BootstrapperApplicationRef>

        
        <Chain>
            <PackageGroupRef Id="PluginSystem" />
            <MsiPackage SourceFile="..\InstallPlugin\bin\Release\en-US\InstallPlugin.msi"
                        Compressed="yes"
                        DisplayInternalUI="no"
                        Vital="yes"
                        Visible="yes"
            >
                <!-- <MsiProperty Name="USERLANGUAGE" Value="[UserLanguage]"/> -->
                <MsiProperty Name="USERLANGUAGE" Value="en-US"/>
            </MsiPackage>
            <ExePackage Id="MiniConda"
                        SourceFile="C:\AnaCondaDependencies\Miniconda3-py39_4.10.3-Windows-x86_64.exe"
                        DetectCondition="CondaFileFound"
                >
                <ExitCode Value ="3010" Behavior="success" />
            </ExePackage>
        </Chain>
    </Bundle>

    <Fragment>
    <util:RegistrySearchRef Id="CondaFound" />
    <util:FileSearchRef Id="CondaFileFound" />
      <util:RegistrySearch
       Id="CondaFound"
       Root="HKLM" Key="SOFTWARE\Python\ContinuumAnalytics\SupportUrl" Value="https://github.com/continuumio/anaconda-issues"
       Result="exists" Variable="CondaFound" />
    
     <util:FileSearch
       Id="CondaFileFound"
       Path="[CommonAppDataFolder]Miniconda3\python39.dll"
       Variable="CondaFileFound"
       Result="exists" />
    </Fragment>
</Wix>


从上面显示的 .wxs 文件可以清楚地看出,我定义了两个条件:CondaFileFoundCondaFound 用作 DetectCondition。两者都不适合我。即使已经安装了 Miniconda,安装程序也会启动 Miniconda 安装程序,并且我的条件会对此进行检查。这真是令人沮丧。我究竟做错了什么?我该如何解决这个问题?

正如 Bob 已经提到的,您在定义的同一个 Fragment 中“引用”RegistrySeach 和 FileSearch 函数调用。这不会从您的 Bundle 中执行它们。

您必须将 RegistrySearchRef 和 FileSearchRef 向上移动到 Bundle 定义中。

查看下面的测试包。

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Bundle Name="Bootstrapper1" Version="1.0.0.0" Manufacturer="cccc" UpgradeCode="b8a7411a-68dc-40a9-9557-d7f64c2e7940">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
    <util:FileSearchRef Id="searchCmd"/>
    <Chain>
      <ExePackage SourceFile="c:\temp\cmd.exe"  DetectCondition="detected"/>
    </Chain>
  </Bundle>
  <Fragment>
    <util:FileSearch
           Id="searchCmd"
           Path="[WindowsVolume]temp\cmd.exe"
           Variable="detected"
            />
  </Fragment>
</Wix>