我想要:
- 创建一个目录。
- 运行另一个安装程序(不是 MSI),将一些文件从第 1 点安装到目录中。
- 替换在第 2 点安装的一些文件。
所有这些都必须在我在 WiX(Windows Installer XML)的帮助下创建的安装下完成。
下面是我的 WiX 文件的一个重要部分。问题是这个安装不会像我想要的那样替换文件。要删除文件,我使用带有 Property 属性的 RemoveFile 元素,因为它是删除不在安装程序数据库中的文件的唯一方法(除了在自定义操作中编写代码 - 这是我不想要的)。
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="ManufacturerDirectory" Name="$(var.Manufacturer)">
<Directory Id="ProductDirectory" Name="$(var.ProductName)">
<Directory Id="SubDirectory" Name="$(var.SubDirectoryName)">
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
<!-- Create the directory at point 1. -->
<Component
Id="RemoveOldData" Guid="..." KeyPath="yes"
Directory="ManufacturerDirectory">
<CreateFolder Directory="ProductDirectory" />
</Component>
<!-- Following two components replace the file(s) (point 3). -->
<Component
Id="RemoveOldData" Guid="..."
Directory="SubDirectory" KeyPath="yes"
>
<RemoveFile
Id="Remove_MyFile.exe" On="install"
Property="SUBDIRECTORYPROPERTY" Name="MyFile.exe" />
</Component>
<Component
Id="FilesToReplace" Guid="..."
Directory="SubDirectory">
<File
Id="MyFile.exe" Vital="yes" KeyPath="yes" DiskId="1"
Source="$(var.SourcePath)MyFile.exe" Name="MyFile.exe"
/>
</Component>
<Binary Id="WiseInstallation" SourceFile="$(var.WiseSourcePath)..." />
<!-- Launch Wise installation at point 2. -->
<CustomAction
Id="LaunchWiseInstallation"
BinaryKey="WiseInstallation"
ExeCommand=""
Return="check"
Execute="deferred"
Impersonate="yes" />
<!-- Following custom action assigns a property.
This needs to remove files that are not in the current installer database.
To do it, the Property attribute of the RemoveFile element is needed. -->
<CustomAction
Id="Assign_SUBDIRECTORYPROPERTY"
Property="SUBDIRECTORYPROPERTY"
Value="[SubDirectory]" />
<InstallExecuteSequence>
<Custom Action="Assign_SUBDIRECTORYPROPERTY" After="InstallInitialize" >
NOT Installed</Custom>
<Custom Action="LaunchWiseInstallation" After="CreateFolders" >
NOT Installed</Custom>
<RemoveFiles Sequence="3720"/>
<RemoveFolders Sequence="3730"/>
</InstallExecuteSequence>
从 Orca 的角度来看 InstallExecuteSequence:
- 验证产品 ID 700
- 成本初始化 800
- 文件成本 900
- 成本最终确定 1000
- 安装验证 1400
- 安装初始化 1500
- 分配_SUBDIRECTORYPROPERTY 1501
- 过程组件 1600
- 取消发布功能 1800
- 删除注册表值 2600
- 删除快捷方式 3200
- 创建文件夹 3700
- LaunchWise 安装 3701
- 删除文件 3720
- 删除文件夹 3730
- 安装文件 4000
- 创建快捷方式 4500
- 写入注册表值 5000
- 注册用户 6000
- 注册产品 6100
- 发布功能 6300
- 发布产品 6400
- 安装完成 6600
我还检查了安装日志文件:
- SUBDIRECTORYPROPERTY 属性分配得当;
- 正确遵循了 InstallExecuteSequence;
- 安装完成,没有错误。
但是这些文件从未被删除或替换!