如果不单击“选项”按钮,Wix 引导程序将无法正确读取 LocalAppDataFolder

Wix bootstrapper won't read LocalAppDataFolder properly if they don't click the Options button

我将 BalExtension 与 WixStandardBootstrapperApplication.HyperlinkSidebarLicense

一起使用

如果他们没有在选项页面中更改安装目录,我希望始终将应用程序安装到当前用户的本地 App Data 文件夹中。 当我完成安装时它工作正常当我单击“选项”按钮并单击“确定”时

但是,如果我在不单击选项页面的情况下完成安装程序。它将改为获取管理应用程序数据文件夹。

我有这样的burn.wxs设置

<?xml version="1.0"?>
<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">
    <Bundle
    Name="My Installer"
    Version="1.0.0.0"
    IconSourceFile="icon.ico"
    Manufacturer="Me">

        <Variable Name="InstallFolder" Type="string" Value="[LocalAppDataFolder]"/>
       ...
        <Chain>
            <ExePackage
                SourceFile="PreReqDrivers.exe"
                InstallCommand="/S"
                UninstallCommand="/S"
                PerMachine="yes">
                ...
            </ExePackage>
            <MsiPackage SourceFile="Main.msi">
                <MsiProperty Name="INSTALLDIR" Value="[InstallFolder]\Test\" />
            </MsiPackage>
        </Chain>
    </Bundle>
    ...
</Wix>

有没有办法始终默认当前用户的本地应用程序数据,无论他们是否单击选项按钮。

我在没有触摸选项按钮和触摸选项按钮的情况下安装它时收集了 2 个日志。

未触及选项按钮:

[1C0C:2CD4][2020-07-09T16:25:45]i001: Burn v3.14.0.4118, Windows v10.0 (Build 18363: Service Pack 0), path: C:\Users\CURRENTUSER\My Installer.exe
[1C0C:2CD4][2020-07-09T16:25:45]i000: Initializing string variable 'InstallFolder' to value '[LocalAppDataFolder]'
...
[1C0C:2CD4][2020-07-09T16:25:53]i201: Planned package: PreReqDrivers.exe, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, cache: Yes, uncache: No, dependency: None
[1C0C:2CD4][2020-07-09T16:25:53]i201: Planned package: Main.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, cache: Yes, uncache: No, dependency: Register
[1C0C:2CD4][2020-07-09T16:25:53]i299: Plan complete, result: 0x0
[1C0C:2CD4][2020-07-09T16:25:53]i300: Apply begin
[1C0C:2CD4][2020-07-09T16:25:53]i010: Launching elevated engine process.
[1C0C:2CD4][2020-07-09T16:25:58]i011: Launched elevated engine process.
[1C0C:2CD4][2020-07-09T16:25:58]i012: Connected to elevated engine.
[26FC:48FC][2020-07-09T16:25:58]i358: Pausing automatic updates.
[26FC:48FC][2020-07-09T16:25:58]i359: Paused automatic updates.
[26FC:48FC][2020-07-09T16:25:58]i360: Creating a system restore point.
[26FC:48FC][2020-07-09T16:25:58]i361: Created a system restore point.
...
[26FC:48FC][2020-07-09T16:26:00]i301: Applying execute package: PreReqDrivers.exe, action: Install, path: C:\ProgramData\Package Cache\[GUID?]\PreReqDrivers.exe, arguments: '"C:\ProgramData\Package Cache\[GUID?]\PreReqDrivers.exe" /S'
[1C0C:2CD4][2020-07-09T16:26:05]i319: Applied execute package: PreReqDrivers.exe, result: 0x0, restart: None
[26FC:48FC][2020-07-09T16:26:05]i323: Registering package dependency provider: {...GUID...}, version: 1.0, package: Main.msi
[26FC:48FC][2020-07-09T16:26:05]i301: Applying execute package: Main.msi, action: Install, path: C:\ProgramData\Package Cache\{...GUID...}v1.0\Main.msi, arguments: ' ARPSYSTEMCOMPONENT="1" MSIFASTINSTALL="7" INSTALLDIR="C:\Users\admin\AppData\Local\Test\"'
[1C0C:2CD4][2020-07-09T16:26:13]i319: Applied execute package: Main.msi, result: 0x0, restart: None
[26FC:48FC][2020-07-09T16:26:13]i325: Registering dependency: {...GUID...} on package provider: {...GUID...}, package: Main.msi
...
[1C0C:2CD4][2020-07-09T16:26:14]i410: Variable: InstallFolder = C:\Users\CURRENTUSER\AppData\Local\
[1C0C:2CD4][2020-07-09T16:26:14]i410: Variable: LocalAppDataFolder = C:\Users\CURRENTUSER\AppData\Local\
...
[1C0C:2CD4][2020-07-09T16:26:14]i007: Exit code: 0x0, restarting: No

触摸选项按钮:

[3FE8:16B8][2020-07-09T16:30:53]i001: Burn v3.14.0.4118, Windows v10.0 (Build 18363: Service Pack 0), path: C:\Users\CURRENTUSER\AppData\Local\Temp\{15330765-B5AB-491D-84A2-D39A5A851BF6}\.cr\My Installer.exe
[3FE8:16B8][2020-07-09T16:30:53]i000: Initializing string variable 'InstallFolder' to value '[LocalAppDataFolder]'
...
[3FE8:16B8][2020-07-09T16:30:59]i201: Planned package: PreReqDrivers.exe, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, cache: Yes, uncache: No, dependency: None
[3FE8:16B8][2020-07-09T16:30:59]i201: Planned package: Main.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, cache: Yes, uncache: No, dependency: Register
[3FE8:16B8][2020-07-09T16:30:59]i299: Plan complete, result: 0x0
[3FE8:16B8][2020-07-09T16:30:59]i300: Apply begin
[3FE8:16B8][2020-07-09T16:30:59]i010: Launching elevated engine process.
[3FE8:16B8][2020-07-09T16:31:03]i011: Launched elevated engine process.
[3FE8:16B8][2020-07-09T16:31:03]i012: Connected to elevated engine.
[36D8:36DC][2020-07-09T16:31:03]i358: Pausing automatic updates.
[36D8:36DC][2020-07-09T16:31:03]i359: Paused automatic updates.
[36D8:36DC][2020-07-09T16:31:03]i360: Creating a system restore point.
[36D8:36DC][2020-07-09T16:31:03]i361: Created a system restore point.
...
[36D8:36DC][2020-07-09T16:31:05]i301: Applying execute package: PreReqDrivers.exe, action: Install, path: C:\ProgramData\Package Cache\[GUID?]\PreReqDrivers.exe, arguments: '"C:\ProgramData\Package Cache\[GUID?]\PreReqDrivers.exe" /S'
[3FE8:16B8][2020-07-09T16:31:10]i319: Applied execute package: PreReqDrivers.exe, result: 0x0, restart: None
[36D8:36DC][2020-07-09T16:31:10]i323: Registering package dependency provider: {...GUID...}, version: 1.0, package: Main.msi
[36D8:36DC][2020-07-09T16:31:10]i301: Applying execute package: Main.msi, action: Install, path: C:\ProgramData\Package Cache\{...GUID...}v1.0\Main.msi, arguments: ' ARPSYSTEMCOMPONENT="1" MSIFASTINSTALL="7" INSTALLDIR="C:\Users\CURRENTUSER\AppData\Local\Test\"'
[3FE8:16B8][2020-07-09T16:31:18]i319: Applied execute package: Main.msi, result: 0x0, restart: None
[36D8:36DC][2020-07-09T16:31:18]i325: Registering dependency: {...GUID...} on package provider: {...GUID...}, package: Main.msi
...
[3FE8:16B8][2020-07-09T16:31:19]i410: Variable: InstallFolder = C:\Users\CURRENTUSER\AppData\Local\
[3FE8:16B8][2020-07-09T16:31:19]i410: Variable: LocalAppDataFolder = C:\Users\CURRENTUSER\AppData\Local\
...
[3FE8:16B8][2020-07-09T16:31:19]i007: Exit code: 0x0, restarting: No

出于某种原因,当我在 <Chain>

之前添加 directorySearch
        <util:DirectorySearch
            Variable="RealInstallFolder"
            Path="[InstallFolder]"/>

然后把我的<MsiPackage>改成了

            <MsiPackage
                SourceFile="Main.msi"
                InstallCondition="NOT (RealInstallFolder = &quot;&quot;)">
                <MsiProperty Name="INSTALLDIR" Value="[RealInstallFolder]\Test\" />
            </MsiPackage>

正在显示日志

[4F94:2A4C][2020-07-10T10:31:50]i000: Setting string variable 'RealInstallFolder' to value 'C:\Users\CURRENTUSER\AppData\Local\'
[4F94:22AC][2020-07-10T10:31:57]i000: Setting string variable 'InstallFolder' to value 'C:\Users\CURRENTUSER\AppData\Local\'
[4F94:2A4C][2020-07-10T10:32:34]i052: Condition 'NOT (RealInstallFolder = "")' evaluates to true.
...
[4F94:2A4C][2020-07-10T10:32:34]i201: Planned package: PreReqDrivers.exe, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, cache: Yes, uncache: No, dependency: None
[4F94:2A4C][2020-07-10T10:32:34]i201: Planned package: Main.msi, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, cache: Yes, uncache: No, dependency: Register
...
[0BD0:3E58][2020-07-10T10:32:45]i301: Applying execute package: Main.msi, action: Install, path: C:\ProgramData\Package Cache\{...GUID...}v1.0\Main.msi, arguments: ' ARPSYSTEMCOMPONENT="1" MSIFASTINSTALL="7" INSTALLDIR="C:\Users\CURRENTUSER\AppData\Local\Test\"'

因此,为了完全解决我的问题,我是这样做的: 我删除了变量声明

<Variable Name="InstallFolder" Type="string" Value="[LocalAppDataFolder]"/>

我加了两个DirectorySearch

        <util:DirectorySearch
            Id="InitialDirectorySearch"
            Variable="InstallFolder"
            Path="[LocalAppDataFolder]"
            />
        <util:DirectorySearch
            Id="SecondDirectorySearch"
            After="InitialDirectorySearch"
            Variable="DefaultInstallFolder"
            Path="[InstallFolder]"
            />

我还修改了 chain 以包含 TWO MsiPackage

            <MsiPackage
                Id="DefaultPackage"
                SourceFile="Main.msi"
                InstallCondition="NOT (DefaultInstallFolder = &quot;&quot;) AND DefaultInstallFolder ~= InstallFolder">
                <MsiProperty Name="INSTALLDIR" Value="[DefaultInstallFolder]\Test\" />
            </MsiPackage>
            <MsiPackage
                Id="ModifiedPackage"
                SourceFile="Main.msi"
                InstallCondition="NOT (DefaultInstallFolder = &quot;&quot;) AND NOT (DefaultInstallFolder ~= InstallFolder)">
                <MsiProperty Name="INSTALLDIR" Value="[InstallFolder]\Test\" />
            </MsiPackage>

此解决方案现在可以正确地将 INSTALLDIR 设置为本地应用程序数据文件夹,即使它们没有打开选项页面也是如此。如果他们决定更改选项上的目录,这也会处理。当用户更改目录文件夹并且它仍然指向他们的本地应用程序数据文件夹时,第一个解决方案失败了。

我猜编译器正在优化之前的构建,并且只会在检测到 InstallFolder 在选项页面上发生更改后或当它被 MsiProperty 使用时才设置 InstallFolder 变量