Sco*_*san 3 installation bundle wix
我的沮丧程度接近 10。我已经在 wix 安装程序上工作了几个星期。此安装程序为我们的软件安装先决条件。我没有 Visual Studio,所以我制作了一个批处理文件来构建(仅读取命令行)wix 项目。该捆绑包中大约有 9 个先决条件,其中包括 .msi、.msu 和 .exe 文件。
我的问题特别涉及链元素中描述的 ExePackage。无论 DetectCondition、InstallCondition、on Install 还是 Unistall,似乎总是安装几个(但不是全部)ExePackages。日志文件显示 DetectCondition = true 和 InstallCondition = false 但这些问题 ExePackages 仍然执行和安装。每一个。时间。
在过去两周的沮丧中,我在 stackoverflow 上的某个地方读到了 ExePackages 不允许安装程序与 .msi 文件具有相同的可见性,这可能会导致我正在处理的内容出现问题。我似乎记得有人提到在卸载时如何执行 ExePackage,如果实际的 .exe 文件没有正确的内部标志,它将安装而不是卸载。但是,如果我没记错的话,虽然这些答案对他们的问题很好,但我一直无法找到在某些条件下完全阻止执行 ExePackage 的东西。
编辑 1:我使用的是 WiX 3.7 版。
我想要一个例子或一些生命线,给我一个关于如何做到这一点的线索。下面是一个问题 ExePacakge 的例子:
...
<Bundle Name='MySoftware' Version='1.0.0.0' Manufacturer='MyCompany'
UpgradeCode='{GUID}'
Condition='(VersionNT >= v6.1 AND ServicePackLevel >= 1)'>
...
<util:FileSearch Id='CheckChromeVersion' Path='[ProgramFilesFolder]Google\Chrome\Application\chrome.exe' Variable='CHROMEVERSION' Result='version' />
<util:FileSearch Id='CheckChromeExists' Path='[ProgramFilesFolder]Google\Chrome\Application\chrome.exe' Variable='CHROMEEXISTS' Result='exists' />
...
<Chain>
...
<ExePackage Id='Chrome'
Compressed='yes'
SourceFile='.\installers\ChromeStandaloneSetup64-v51.0.2704.103.exe'
PerMachine='yes'
DetectCondition='CHROMEEXISTS AND CHROMEVERSION="51.0.2704.103"'
InstallCondition='(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' />
...
</Chain>
</Bundle>
...
Run Code Online (Sandbox Code Playgroud)
以下是日志文件中“chrome”的所有实例:
[0910:0794][2017-09-20T06:30:33]i000: Setting numeric variable 'CHROMEEXISTS' to value 1
[0910:0794][2017-09-20T06:30:33]i000: Setting version variable 'CHROMEVERSION' to value '51.0.2704.103'
[0910:0794][2017-09-20T06:30:33]i052: Condition 'CHROMEEXISTS AND CHROMEVERSION="51.0.2704.103"' evaluates to true.
[0910:0794][2017-09-20T06:30:33]i101: Detected package: Chrome, state: Present, cached: None
[0910:0794][2017-09-20T06:30:34]i052: Condition '(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' evaluates to false.
[0910:0794][2017-09-20T06:30:34]w321: Skipping dependency registration on package with no dependency providers: Chrome
[0910:0794][2017-09-20T06:30:34]i000: Setting string variable 'WixBundleLog_Chrome' to value 'C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome.log'
[0910:0794][2017-09-20T06:30:34]i000: Setting string variable 'WixBundleRollbackLog_Chrome' to value 'C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome_rollback.log'
[0910:0794][2017-09-20T06:30:34]i201: Planned package: Chrome, state: Present, default requested: Absent, ba requested: Absent, execute: Uninstall, rollback: Install, cache: Yes, uncache: Yes, dependency: None
[01B4:0E6C][2017-09-20T06:30:54]i305: Verified acquired payload: Chrome at path: C:\ProgramData\Package Cache\.unverified\Chrome, moving to: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe.
[01B4:0F1C][2017-09-20T06:31:19]i301: Applying execute package: Chrome, action: Uninstall, path: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe, arguments: '"C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe"'
[0910:0794][2017-09-20T06:31:33]i319: Applied execute package: Chrome, result: 0x0, restart: None
[01B4:0F1C][2017-09-20T06:31:59]i351: Removing cached package: Chrome, from path: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\
[0910:0794][2017-09-20T06:32:02]i410: Variable: CHROMEEXISTS = 1
[0910:0794][2017-09-20T06:32:02]i410: Variable: CHROMEVERSION = 51.0.2704.103
[0910:0794][2017-09-20T06:32:02]i410: Variable: WixBundleLog_Chrome = C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome.log
[0910:0794][2017-09-20T06:32:02]i410: Variable: WixBundleRollbackLog_Chrome = C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome_rollback.log
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助。
该问题是由您的ExePackage上的 InstallCondition 引起的
安装包之前要评估的条件。仅当条件评估为真时才会安装该软件包。如果条件评估为 false 并且正在安装、修复或修改包,则将卸载包。
在您的日志中,您可以看到 DetectCondition 被正确评估为“True”,因此该包确实检测到安装了正确版本的 Chrome。
但是 InstallCondition 被评估为 false
[0910:0794][2017-09-20T06:30:34]i052: Condition '(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' evaluates to false.
Run Code Online (Sandbox Code Playgroud)
这会导致此计划行出现
[0910:0794][2017-09-20T06:30:34]i201: Planned package: Chrome, state: Present, default requested: Absent, ba requested: Absent, execute: Uninstall, rollback: Install, cache: Yes, uncache: Yes, dependency: None
Run Code Online (Sandbox Code Playgroud)
我认为安装条件应该用于以下情况:您可以根据系统上已有的内容或在引导程序的 UI 部分选择安装的内容有选择地安装内容。即:如果另一个程序已经存在,您可以使用此 ExePackage 否则不要安装它(如果其他程序不再存在,则卸载它)。在这种情况下,您将使用安装条件,但通常定义安装条件是没有用的。
下面的旧答案不适用于该问题,但它仍然对具有版本比较条件的人有用,因此我将保留它
条件中的版本比较应该是
CHROMEVERSION gt;= v51.0.2704.103
版本前面的 v 告诉 wix 将条件评估为两个版本变量。所有 RegistrySearch 变量都是字符串变量,条件中的变量之间的比较是根据变量本身的格式进行评估的。由于注册表搜索始终是一个字符串,表达式中的另一个操作数决定了比较的类型。