在 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 文件可以清楚地看出,我定义了两个条件:CondaFileFound
和 CondaFound
用作 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>
我正在开发调用 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 文件可以清楚地看出,我定义了两个条件:CondaFileFound
和 CondaFound
用作 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>