合并打包机制到 XP.Installer README
This commit is contained in:
+114
-6
@@ -1,17 +1,125 @@
|
||||
# XP.Installer
|
||||
|
||||
独立的 WiX 安装包解决方案。
|
||||
独立的 WiX 安装包解决方案,采用“两层式安装包”结构:
|
||||
|
||||
## 解决方案
|
||||
```text
|
||||
BundleInstaller.exe(外层 Bootstrapper/Bundle)
|
||||
└── Installer.msi(内层 MSI 安装包)
|
||||
```
|
||||
|
||||
- 解决方案:`Setup\BundleInstaller\XP.Installer.sln`
|
||||
## 解决方案与项目
|
||||
|
||||
- 解决方案:`XP.Installer.sln` 或 `Setup\BundleInstaller\XP.Installer.sln`
|
||||
- 配置:`Release | x64`
|
||||
- 主要输出:`Setup\BundleInstaller\bin\x64\Release\BundleInstaller.exe`
|
||||
- 最终输出:`Setup\BundleInstaller\bin\x64\Release\BundleInstaller.exe`
|
||||
- MSI 输出:`Setup\BundleInstaller\bin\x64\Release\Installer.msi`
|
||||
|
||||
解决方案包含 4 个项目:
|
||||
|
||||
| 项目 | 类型 | 作用 |
|
||||
|---|---|---|
|
||||
| `CustomActions` | C# 类库 | 许可证选择、授权检测和 MSI 自定义操作 |
|
||||
| `Product_Main` | WiX MSI 项目 | 生成 `Installer.msi`,安装产品文件、目录、快捷方式、注册表和 MSI UI |
|
||||
| `Bootstrapper.Ui` | C# WPF 类库 | 提供欢迎页、许可证页、进度页、升级提示等安装向导界面 |
|
||||
| `Bootstrapper` | WiX Bundle 项目 | 将 MSI、前置依赖和 WPF UI 组合为最终的 `BundleInstaller.exe` |
|
||||
|
||||
依赖关系:
|
||||
|
||||
```text
|
||||
CustomActions
|
||||
↓
|
||||
Product_Main(Installer.msi)
|
||||
↓
|
||||
Bootstrapper.Ui
|
||||
↓
|
||||
Bootstrapper(BundleInstaller.exe)
|
||||
```
|
||||
|
||||
最终用户通常运行 `BundleInstaller.exe`。直接运行 `Installer.msi` 不包含完整的 Bundle 前置依赖检测和自定义引导界面。
|
||||
|
||||
## 构建要求
|
||||
|
||||
- Visual Studio 2022
|
||||
- WiX Toolset 3.x 及 Votive 扩展
|
||||
- 本目录 `Setup\BundleInstaller\packages` 中的本地 NuGet 依赖
|
||||
- `Setup\BundleInstaller\packages` 中的本地构建依赖
|
||||
- `ReleaseFiles` 目录及 `Files.wxs` 中声明的外部文件
|
||||
|
||||
安装包工程依赖 `ReleaseFiles` 目录和 `Files.wxs` 中声明的外部文件。构建前请确认这些输入文件已准备好。
|
||||
## 目录职责
|
||||
|
||||
`XP.Installer` 是“通用安装框架 + 当前产品定制内容”的组合。
|
||||
|
||||
### 与待打包软件直接相关
|
||||
|
||||
| 路径 | 作用 |
|
||||
|---|---|
|
||||
| `Setup\BundleInstaller\IDE\` | 待打包软件的实际文件输入目录;当前文件清单仍引用外部 `D:\07_IDE\IDEAuto\...` 路径 |
|
||||
| `Setup\BundleInstaller\Files.wxs` | MSI 产品文件、目录、配置文件和资源清单 |
|
||||
| `Setup\BundleInstaller\ReleaseFiles.generated.wxs` | 根据发布目录生成的产品文件清单,不建议手工编辑 |
|
||||
| `Setup\BundleInstaller\ProjectDefaults.wxi` | 产品名、版本、厂商、升级 GUID 和前置依赖开关 |
|
||||
| `Setup\BundleInstaller\UIresource\` | 产品 Logo、安装背景、按钮和图标 |
|
||||
| `Setup\BundleInstaller\CustomActions\` | HASP/LMS 许可证选择和授权相关逻辑 |
|
||||
| `Setup\BundleInstaller\WPFInstaller\Dependencies\` | 授权、硬件锁和安装辅助 DLL |
|
||||
| `Setup\BundleInstaller\WPFInstaller\Resources\` | Bundle 图标、启动图、许可证文本等资源 |
|
||||
| `Setup\BundleInstaller\WPFInstaller.Ui\` | 产品化安装向导页面、主题、文本和许可证流程 |
|
||||
| `Setup\Webupdater\UpdaterFiles.wxs` | WebUpdater/联网升级文件清单,结构可复用但内容属于产品 |
|
||||
|
||||
换产品时,不能只修改产品名称;至少需要重新确认 `ProjectDefaults.wxi`、`Files.wxs`、生成文件清单、`Bundle.wxs`、许可证逻辑、升级 GUID 和品牌资源。
|
||||
|
||||
### 通用安装工程基础设施
|
||||
|
||||
| 路径 | 作用 |
|
||||
|---|---|
|
||||
| `Product_Main.wixproj` | WiX MSI 构建配置 |
|
||||
| `WPFInstaller\Bootstrapper.wixproj` | WiX Burn Bundle 构建配置 |
|
||||
| `WPFInstaller.Ui\Bootstrapper.Ui.csproj` | WPF 安装向导构建配置 |
|
||||
| `Setup.wxs`、`UI_Texts.wxs` | MSI 安装目录、UI 序列、文本和自定义操作编排 |
|
||||
| `WPFInstaller\Bundle.wxs` | Burn 安装链、MSI、前置依赖和自定义 UI 编排 |
|
||||
| `Defines.wxi` | 环境变量与默认值之间的 WiX 预处理变量桥接 |
|
||||
| `ReleaseFilesRoot.wxs` | 发布文件目录的 WiX 根节点和变量入口 |
|
||||
| `Setup\Scripts\` | CI/批处理构建参数和自动化脚本 |
|
||||
| `Resource\InstallUtils.dll` | 安装过程使用的辅助组件,是否能跨产品复用需单独确认 |
|
||||
|
||||
### 开发工具、依赖和生成文件
|
||||
|
||||
- `Votive2022.vsix`、`wix314.exe`:WiX 开发环境安装包,不会装入最终产品。
|
||||
- `WixEdit\binaries\`:手动编辑或 harvest `Files.wxs` 的辅助工具,不参与正式构建。
|
||||
- `Setup\BundleInstaller\packages\`:WiX、Xeam 和 WPF 构建依赖,不是待打包业务软件。
|
||||
- `bin\`、`obj\`、`.vs\`:构建输出和 Visual Studio 缓存,不应作为源文件维护。
|
||||
|
||||
## 关键机制
|
||||
|
||||
### 变量与版本控制
|
||||
|
||||
`ProjectDefaults.wxi` 使用 `<?define ?>` 声明产品名称、版本、厂商、ProductCode、UpgradeCode、BundleUpgradeCode 和前置依赖开关;`Defines.wxi` 提供“环境变量优先,否则使用默认值”的兜底逻辑,供 `Setup\Scripts\DefaultVariables.bat` 或 CI 使用。
|
||||
|
||||
### 产品文件清单
|
||||
|
||||
`Files.wxs` 使用 WiX `<Component>/<File>` 声明安装到 `Program Files\<厂商>\<产品名>\IDE\` 的文件。当前清单包含硬编码的外部路径,换机器或换产品时应使用 `WixEdit\binaries\WixEdit.exe` 重新导入目录并替换对应节点。
|
||||
|
||||
### 许可证逻辑
|
||||
|
||||
MSI 层由 `CustomActions\CustomAction.cs` 的 `HandleLicenseChoice` 调用 WinForms 许可证选择窗口;Bundle 层由 `WPFInstaller.Ui\LicenseChoiceViewModel.cs` 通过 `WriteVariableToBundle` 写入 Bundle 变量。两者通过 `Resource\InstallUtils.dll` 执行实际授权检测或写入。
|
||||
|
||||
### Bundle 安装链与自定义 UI
|
||||
|
||||
`WPFInstaller\Bundle.wxs` 按 `ProjectDefaults.wxi` 中的 `INCLUDE_*` 开关注册 Windows Installer、VC++、.NET、SQL Server Express 等前置包,最后加入内层 MSI。`WPFInstaller.Ui` 集成 `Hex.Wix.Xeam.1.2.6` 提供的 Xeam Visual Installer,通过 `VisualInstallerConfig.xml` 配置页面顺序、主题和许可证页面。
|
||||
|
||||
## 手动打包流程
|
||||
|
||||
以打包 IDE 软件为例:
|
||||
|
||||
1. 确认待打包发布文件和 `Files.wxs` 中引用的外部文件存在。
|
||||
2. 用 Visual Studio 打开 `XP.Installer.sln`,或打开 `Setup\BundleInstaller\XP.Installer.sln`。
|
||||
3. 如需更新文件清单,打开 `WixEdit\binaries\WixEdit.exe`,使用 `Import directory` 导入 release 文件夹并保存 `.wxs` 片段。
|
||||
4. 将生成的目录节点替换到 `Setup\BundleInstaller\Files.wxs`,并检查主程序的 `KeyPath="yes"`。
|
||||
5. 修改 `ProjectDefaults.wxi` 中的产品名、版本号、厂商和 GUID。
|
||||
6. 替换 `UIresource`、`WPFInstaller\Resources`、`WPFInstaller.Ui\Resources` 中的产品图标、Logo、启动图和许可证文件。
|
||||
7. 切换到 `Release | x64`,重新生成解决方案。
|
||||
8. 从 `Setup\BundleInstaller\bin\x64\Release\BundleInstaller.exe` 获取最终安装包。
|
||||
|
||||
## 注意事项
|
||||
|
||||
- `CustomActions\bin\x64\Release\CustomActions.CA.dll` 被 `Setup.wxs` 硬编码引用;修改自定义操作后必须先重新生成 `CustomActions`。
|
||||
- 修改 GUID 时要区分升级版本和全新产品。保持相同 UpgradeCode 才能形成同一升级链,全新品牌通常需要新 GUID。
|
||||
- `Files.wxs` 中的绝对路径是当前工程的主要可移植性问题,不能只修改一个根路径后假设所有文件都存在。
|
||||
- 生成的 MSI 和 Bundle 必须使用同一配置、平台和版本信息。
|
||||
|
||||
@@ -1,150 +0,0 @@
|
||||
# 打包机制与使用说明
|
||||
|
||||
## 一、整体架构
|
||||
|
||||
这是一套基于 **WiX Toolset 3.x**(工作区根目录 `wix314.exe` 即 WiX v3.14 安装包,`Votive2022.vsix` 是配套的 VS2022 WiX 项目扩展)二次开发的**两层式安装包**方案,位于 `Setup\BundleInstaller`:
|
||||
|
||||
```
|
||||
BundleInstaller.exe (外层 Bootstrapper/Bundle)
|
||||
└── Installer.msi (内层 MSI 安装包)
|
||||
```
|
||||
|
||||
解决方案 `XP.Installer.sln` 包含 4 个项目,构建时按依赖顺序编译:
|
||||
|
||||
| 项目 | 类型 | 作用 |
|
||||
|---|---|---|
|
||||
| `CustomActions` | C# 类库(.dll) | MSI 自定义操作代码(许可证类型选择弹窗等) |
|
||||
| `Product_Main`(`Files.wxs` / `Setup.wxs`) | WiX MSI 项目 | 生成 `Installer.msi`,声明所有产品文件、注册表、快捷方式、经典 MSI UI |
|
||||
| `Bootstrapper.Ui`(`WPFInstaller.Ui`) | C# WPF 类库 | 基于第三方组件 **Xeam Visual Installer**(`packages\Hex.Wix.Xeam.1.2.6`)实现的自定义美化安装向导界面 |
|
||||
| `Bootstrapper`(`WPFInstaller\Bundle.wxs`) | WiX Bundle 项目 | 生成最终 `BundleInstaller.exe`,把 MSI + 各种运行时前置组件(.NET、VC++ Redistributable 等)打包链接在一起,并挂载自定义 WPF UI |
|
||||
|
||||
### 项目依赖关系与职责
|
||||
|
||||
这 4 个项目分别负责不同层次的安装功能,依赖关系如下:
|
||||
|
||||
```text
|
||||
CustomActions
|
||||
↓
|
||||
Product_Main(Installer.msi)
|
||||
↓
|
||||
Bootstrapper.Ui
|
||||
↓
|
||||
Bootstrapper(BundleInstaller.exe)
|
||||
```
|
||||
|
||||
- `CustomActions`:C# 自定义操作 DLL,执行许可证选择、授权检测以及安装前后的特殊处理。
|
||||
- `Product_Main`:WiX MSI 项目,生成核心 `Installer.msi`,负责安装产品文件、目录、快捷方式、注册表和 MSI 安装界面。
|
||||
- `Bootstrapper.Ui`:WPF 安装界面类库,提供欢迎页、许可证页、进度页、升级提示等可视化安装向导页面。
|
||||
- `Bootstrapper`:WiX Burn 引导程序,把 `Installer.msi`、前置运行时和 `Bootstrapper.Ui` 组合为最终的 `BundleInstaller.exe`,负责整体安装、依赖检测和升级流程。
|
||||
|
||||
最终用户通常运行 `BundleInstaller.exe`。直接运行 `Installer.msi` 只会执行内层 MSI 安装流程,不包含完整的 Bundle 前置依赖检测和自定义引导界面。
|
||||
|
||||
### 打包目录总览:产品专属内容与通用基础设施
|
||||
|
||||
`XP.Installer` 不是一个完全通用的空白 WiX 模板,而是“通用安装框架 + 当前产品定制内容”的组合。维护或复用时可按下面的边界判断:
|
||||
|
||||
#### 一、与待打包软件直接相关的内容
|
||||
|
||||
这些文件决定安装包中安装什么软件、安装到哪里、显示什么产品信息以及执行哪些产品授权逻辑:
|
||||
|
||||
| 路径 | 作用 | 复用时的处理 |
|
||||
|---|---|---|
|
||||
| `Setup\BundleInstaller\IDE\` | 待打包软件的实际文件输入目录;当前 `Files.wxs` 仍引用外部 `D:\07_IDE\IDEAuto\...` 路径 | 换产品时必须替换,并同步重新生成文件清单 |
|
||||
| `Setup\BundleInstaller\Files.wxs` | MSI 的产品文件、目录、配置文件和资源清单 | 产品专属,通常需要重新 harvest 或修改 `Source` |
|
||||
| `Setup\BundleInstaller\ReleaseFiles.generated.wxs` | 根据发布目录生成的产品文件清单 | 生成文件,不建议手工编辑;换产品后重新生成 |
|
||||
| `Setup\BundleInstaller\ProjectDefaults.wxi` | 产品名、版本、厂商、升级 GUID、前置依赖开关等默认值 | 产品专属,发布新产品或新版本时重点修改 |
|
||||
| `Setup\BundleInstaller\UIresource\` | MSI 安装界面的公司 Logo、产品 Logo、按钮和背景资源 | 产品品牌资源,需要按产品替换 |
|
||||
| `Setup\BundleInstaller\CustomActions\` | 许可证类型选择、HASP/LMS 授权处理等自定义操作 | 当前产品/授权体系专属,不能直接视为通用代码 |
|
||||
| `Setup\BundleInstaller\WPFInstaller\Dependencies\` | 安装过程中使用的授权、硬件锁和安装辅助 DLL | 与当前产品及授权环境相关,替换产品时必须重新确认 |
|
||||
| `Setup\BundleInstaller\WPFInstaller\Resources\` | Bundle 图标、启动图、许可证文本等资源 | 部分是通用 UI 资源,许可证和品牌文件属于产品专属 |
|
||||
| `Setup\BundleInstaller\WPFInstaller.Ui\` | 自定义安装向导页面、许可证页面、产品标题和主题资源 | 基于通用框架,但页面内容和授权流程是当前产品定制 |
|
||||
| `Setup\Webupdater\UpdaterFiles.wxs` | WebUpdater/联网升级相关文件的安装清单 | 结构可复用,但升级程序和文件内容属于产品专属 |
|
||||
|
||||
#### 二、通用的安装工程基础设施
|
||||
|
||||
这些内容主要负责 WiX 编译、MSI/Burn 编排和安装流程,本身不等同于被安装的业务软件:
|
||||
|
||||
| 路径 | 作用 |
|
||||
|---|---|
|
||||
| `XP.Installer.sln`、`Setup\BundleInstaller\XP.Installer.sln` | Visual Studio 解决方案入口 |
|
||||
| `Product_Main.wixproj` | WiX MSI 项目构建配置 |
|
||||
| `WPFInstaller\Bootstrapper.wixproj` | WiX Burn Bundle 项目构建配置 |
|
||||
| `WPFInstaller.Ui\Bootstrapper.Ui.csproj` | WPF 安装向导类库构建配置 |
|
||||
| `Setup.wxs`、`UI_Texts.wxs` | MSI 安装目录、UI 序列、文本和自定义操作的 WiX 编排;结构通用,但其中的产品属性和引用需要检查 |
|
||||
| `WPFInstaller\Bundle.wxs` | Burn 引导程序的安装链、MSI 包、前置依赖和自定义 UI 编排;结构通用,但产品版本、包路径和升级码仍需按产品配置 |
|
||||
| `Defines.wxi` | 环境变量与默认值之间的 WiX 预处理变量桥接 |
|
||||
| `ReleaseFilesRoot.wxs` | 发布文件目录的 WiX 根节点和变量入口 |
|
||||
| `Setup\Scripts\` | CI/批处理构建参数和自动化脚本;脚本结构通用,默认路径和项目名称是当前工程定制 |
|
||||
| `Resource\InstallUtils.dll` | 安装过程使用的辅助组件,是否能跨产品复用需结合其接口和授权逻辑确认 |
|
||||
|
||||
#### 三、开发工具、依赖和生成文件
|
||||
|
||||
- `Votive2022.vsix`、`wix314.exe`:WiX 开发环境安装包,不会被装入最终产品。
|
||||
- `WixEdit\binaries\`:用于手动编辑/harvest `Files.wxs` 的辅助工具,不参与正式构建。
|
||||
- `Setup\BundleInstaller\packages\`:WiX、Xeam、WPF 依赖等构建依赖,不是待打包软件本身;其中 `Hex.Wix.Xeam.1.2.6` 提供安装向导框架和相关运行库。
|
||||
- `bin\`、`obj\`、`.vs\`:构建输出和 Visual Studio 缓存,不应作为源文件维护。
|
||||
|
||||
复用该安装器时,建议保留通用工程骨架,再优先替换“产品专属内容”表中的文件;特别是 `ProjectDefaults.wxi`、`Files.wxs`、`ReleaseFiles.generated.wxs`、`Bundle.wxs`、许可证逻辑和品牌资源,不能只修改产品名称后直接用于另一个软件。
|
||||
|
||||
## 二、关键机制
|
||||
|
||||
### 1. 变量/版本控制中心:`Defines.wxi` + `ProjectDefaults.wxi`
|
||||
|
||||
所有产品名称、版本号、厂商信息、安装 GUID(ProductCode/UpgradeCode/BundleUpgradeCode)、要不要内置 .NET/VC++ 前置依赖(`INCLUDE_DOTNET_461`、`INCLUDE_VS_2017_INSTALLER` 等开关)都在 `ProjectDefaults.wxi` 里用 `<?define ?>` 声明默认值,`Defines.wxi` 再做"环境变量优先、否则用默认值"的兜底逻辑(`?ifdef env.XXX?...?else?...?endif?`)。这套设计是为了配合 Jenkins CI(`Setup\Scripts\DefaultVariables.bat`)传入环境变量做自动化构建,但手动打包时可以直接改 `ProjectDefaults.wxi` 里的默认值。
|
||||
|
||||
### 2. 产品文件清单:`Files.wxs`
|
||||
|
||||
用 WiX `<Component>/<File>` 声明每一个要装到 `Program Files\<厂商>\<产品名>\IDE\` 下的文件,路径目前写死指向开发机本地路径(`D:\07_IDE\IDEAuto\...`),这是通过 **WixEdit** 工具"导入目录(harvest)"生成的,不是手写的。
|
||||
|
||||
### 3. 双重许可证选择逻辑(HASP 硬件锁 / LMS 软件授权)
|
||||
|
||||
项目里有**两套并行实现**同一功能:
|
||||
- MSI 层:`CustomActions\CustomAction.cs` 的 `HandleLicenseChoice` 调用 `LicenseTypeChoiceForm`(WinForm)弹窗,写入 `USELMSLICENSING` 属性,供传统 MSI UI 序列使用。
|
||||
- Bundle 层:`WPFInstaller.Ui\LicenseChoiceViewModel.cs` 是 Xeam Visual Installer 框架下的 WPF 页面,把选择结果通过 `WriteVariableToBundle` 写入 Bundle 变量 `LICENSETYPE`/`USELMSLICENSING`,再透传给内层 MSI。
|
||||
|
||||
两者通过 `InstallUtils.dll`(`Resource\InstallUtils.dll`,一个原生 DLL,用 `DllImport` 序号方式调用)做实际的授权检测/写入。
|
||||
|
||||
### 4. Bundle 链(`WPFInstaller\Bundle.wxs`)
|
||||
|
||||
`<Chain>` 里按 `ProjectDefaults.wxi` 的 `INCLUDE_*` 开关,依次注册要装的前置包(Windows Installer、VC++ 2010~2017 Redistributable、.NET Framework、SQL Server Express、CLM Tools 等),最后固定加入 `PackageGroupRef Id="Package_HEXAGON_APP_$(var.Platform)"`(即内层 MSI)。
|
||||
|
||||
### 5. 自定义向导 UI
|
||||
|
||||
`WPFInstaller.Ui` 不是标准 WiX Bootstrapper UI,而是集成了商业组件 **Xeam Visual Installer**(授权信息可见于 `VisualInstallerConfig.xml` 里的 `License` 节点),通过 `VisualInstallerConfig.xml` 声明向导页面顺序(`InstallWelcome → Progress → Finish` 等)、主题色、License 弹窗等,比原生 WiX UI 美观。
|
||||
|
||||
## 三、使用方法(手动打包流程)
|
||||
|
||||
以打包"IDE"软件为例:
|
||||
|
||||
### 准备工作
|
||||
|
||||
1. 安装 WiX Toolset v3.14.1(工作区根目录已有 `wix314.exe`)
|
||||
2. 关闭 VS,安装 `Votive2022.vsix`(WiX v3 的 VS 扩展)
|
||||
|
||||
### 打包步骤
|
||||
|
||||
1. 用 VS 打开 `Setup\BundleInstaller\XP.Installer.sln`,先"重新生成解决方案"一次
|
||||
2. 打开 `WixEdit\binaries\WixEdit.exe`,新建项目
|
||||
3. 选择 "Import directory",导入需要打包的 release 文件夹(体积大会卡顿,属正常现象)
|
||||
4. 一路 Next 直到导入完成,点 Done
|
||||
5. File → Save As 保存生成的 `.wxs` 片段
|
||||
6. 手工编辑该文件:
|
||||
- 把所有 `DiskId="1"` 替换成 `Feature="PRODUCTMAIN" Win64="$(var.Win64)"`
|
||||
- 找到主程序 `File Id="IDEAUTO.EXE"` 那一行,末尾加 `KeyPath="yes"`
|
||||
7. 用刚保存的 `<Directory Id="IDE" Name="IDE">...</Directory>` 节点,整段替换掉 `Setup\BundleInstaller\Files.wxs` 里对应的旧节点
|
||||
8. 编辑 `ProjectDefaults.wxi` 第 1-42 行(产品名、版本号、GUID 等,文件里都有中文注释说明含义)
|
||||
9. 更换产品图标/资源:
|
||||
- `WPFInstaller\Resources\icon.ico`
|
||||
- `WPFInstaller.Ui\Resources\icon.ico`、`ProductIcon.png`
|
||||
- `UIresource\product.ico`
|
||||
10. 更换用户协议:
|
||||
- `WPFInstaller\Resources\VisualInstaller\Localization\license_zh-CN.RTF`
|
||||
- `WPFInstaller\Resources\VisualInstaller\Localization\license_en-US.RTF`
|
||||
11. 切到 `Release / x64`,重新生成解决方案
|
||||
12. 生成的安装包在 `Setup\BundleInstaller\bin\x64\Release\BundleInstaller.exe`
|
||||
|
||||
## 四、注意事项(教程未提但会影响打包结果的点)
|
||||
|
||||
- `CustomActions\bin\x64\Release\CustomActions.CA.dll` 是 `Setup.wxs` 里 `Binary Id='CustomActions'` 硬编码引用的路径,若只重建了 `Product_Main` 而没重建 `CustomActions` 项目,MSI 里许可证弹窗的自定义操作可能是旧版本。
|
||||
- `Defines.wxi` 里的 GUID(`PRODUCTCODE_GUID` / `UPGRADECODE_GUID` / `BUNDLE_UPGRADECODE_GUID`)如果不改,新产品会被 Windows 认作同一升级链的旧产品版本,安装时会触发 `MajorUpgrade`(自动卸载旧版)逻辑,做全新品牌打包时务必生成新 GUID。
|
||||
- `Files.wxs` 里文件路径是硬编码的绝对路径(当前指向别人的开发机路径),这也是为什么必须用 WixEdit 重新 harvest 并替换该节点,而不能直接改路径字符串(因为每个文件都有独立 `Source` 属性且每次 harvest 都会重新生成,也可以手动全部替换成相对路径)。
|
||||
Reference in New Issue
Block a user