ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Advanced Installer 20.7.1 实战:从零打造专业 Windows 安装包

Advanced Installer 20.7.1 实战:从零打造专业 Windows 安装包 简介Advanced Installer 20.7.1 是一款面向软件开发者与打包工程师的 Windows Installer 制作工具提供可视化界面可生成符合 MS Windows 认证的 MSI 安装包并支持自定义欢迎与安装过程界面适合需要规范化发布 Windows 软件或制作企业级安装程序的场景。资源内含完整安装包程序文件压缩包约 161.36MB共 2000 个文件以 png、aip、jpg、ico、xsd、rtf 等类型为主其中 aip 工程文件用于保存安装项目配置png/jpg/ico 为界面与图标素材xsd/rtf/xml 等则包含配置定义与文档说明整体目录结构清晰。截至当前已有 937 人学习下载。通过该资源可快速获取 Advanced Installer 20.7.1 的封装资源便于直接安装使用免去自行搜索下载的麻烦同时可参考其中示例工程与素材加深对 MSI 打包流程和界面定制的理解。 打包工具这个事说难不难说简单也不简单。我这些年折腾过不少软件分发从最早的绿色免安装到后来用各种脚本做安装包再到接触 Advanced Installer 20.7.1 这类专业工具最大的感受就是一个好的打包工具真的能把交付软件这个动作从玄学变成科学。这篇文章我不打算写那种官方文档式的功能介绍而是从实际使用的角度聊聊这个版本到底能干什么、适合谁、以及我在真实项目里踩过的坑和总结出来的经验。先回答一个很多人关心的问题Advanced Installer 到底是干嘛的一句话说清楚它是用来把应用程序打包成 Windows 安装程序EXE、MSI、MSIX的软件。不管你是 C、C#、Java 还是 Python 写的程序最终要交付给用户总得有个像样的安装包——带图标、带安装向导、能写注册表、能创建桌面快捷方式、能处理依赖库甚至能安装 Windows 服务。这些需求Advanced Installer 基本都能覆盖20.7.1 这个版本在稳定性和构建速度上相比之前的版本又有一些提升。这工具适合谁我觉得有三类人用得上第一类是独立开发者自己写的软件需要发给客户不想让客户看到一堆散落的文件第二类是公司里的运维或发布工程师需要频繁出包还得对接自动构建流程第三类是刚接触软件分发的学生或爱好者想做出一个正式感十足的安装包。无论哪一类这篇文章提到的思路和步骤应该都能帮你少走不少弯路。1. 内容整体设计与思路拆解1.1 打包工具这摊事到底复杂在哪很多人第一次写软件的时候觉得打包就是把 exe 丢给对方就行了。等你真的试过一次就会发现问题一个接一个目标机器上没有 .NET 运行时怎么办缺 VC 运行库怎么办软件需要写注册表才有授权信息怎么办用户装到非默认路径程序找不到配置文件怎么办这些问题的本质是你的软件不是孤岛它依赖操作系统提供的一系列运行环境、权限和资源配置。打包工具干的事情就是把运行环境准备、文件分发、系统配置变更、卸载清理这一整套流程封装成一个对用户友好的向导程序。Advanced Installer 的优势在于它不是只做文件拷贝这一层。它可以检测目标机器上的前置依赖比如 .NET Framework 版本可以在安装过程中执行自定义脚本可以配置 IIS 站点、Windows 服务、驱动、注册表项甚至能生成符合企业部署规范的转换文件MST。这就不单单是一个打包器而是一个小型的软件分发编排工具。1.2 在同类工具里Advanced Installer 算什么定位市面上常见的打包工具不少每个人的第一反应可能是 Inno Setup 或者 NSIS。这俩是免费开源的脚本型工具灵活性强但一切都要写脚本学习曲线陡而且调试脚本这种体验实在是谈不上愉快。也有人用 Visual Studio 自带的 InstallShield LE但它限制太多稍微复杂一点的场景就力不从心。Advanced Installer 的商业定位其实是专业版甚至企业版的 InstallShield 替代品它把很多原先必须写脚本的活儿变成了 GUI 配置。用图形界面勾选、填表大部分常见需求根本不用写一行脚本。同时它也保留了自定义操作Custom Actions的入口给那些确实需要写代码的场景留了后路。20.7.1 这个版本在我看来最大的价值就是成熟一些老版本里偶尔出现的界面卡顿、构建资源占用过高的问题这个版本体感上已经有了明显改善。2. 核心细节解析与实操要点2.1 打包类型的选型逻辑EXE、MSI 还是 MSIXAdvanced Installer 支持多种输出格式但新手上来就会卡在第一个选择题上我到底要打 EXE 还是 MSI或者微软力推的 MSIX我的建议其实很简单如果给普通消费者用选 EXE 引导程序 MSI 内部负载如果走企业分发选纯粹的 MSI如果想要微软商店分发或者自动更新体验再考虑 MSIX。这不是随便说的背后有很实际的理由。EXE 其实是一个引导程序Bootstrapper它负责检查前置条件比如.NET 框架装了没有没装就先帮你装上然后再静默调用内嵌的 MSI 去执行真正的安装流程。MSI 则是 Windows 安装程序的原生格式它最大的好处是支持按需安装、修复安装、以及最关键的——干净的卸载。MSI 有完整的安装状态数据库文件该放哪、注册表改过什么卸载时都能精准清掉不会在系统里留一堆垃圾。MSIX 是更新的格式主打沙箱化和增量更新对 UWP 和商店分发很友好。但它在 Win10 以下系统支持不好而且对某些需要管理员权限、写系统服务的传统软件并不友好。所以除非你是做微软生态的新式应用否则暂缓考虑 MSIX 也不是什么问题。2.2 GUI 配置的核心模块提前心里有数打开 Advanced Installer 20.7.1 的工程界面左侧是一棵项目树新手容易懵。其实就那么几个核心模块你可以把它们理解为安装包的器官Files and Folders文件与文件夹这是最核心的地方虚拟地呈现目标机器安装后的目录结构。左边选要安装到的目标路径右边放你要分发的文件。Shortcuts快捷方式在这里创建开始菜单和桌面的快捷方式。Registry注册表如果需要写入或修改注册表键值在这配。注意这里有个细节在卸载时是否主动删除注册表项最好明确指定否则容易留下残余。Launch Conditions and Prerequisites启动条件和前置依赖在这里配置目标机器至少是什么操作系统必须安装哪些运行库。这是保证用户不出错的关键。Custom Actions自定义操作当标准行为满足不了你时可以嵌入一段脚本或程序在安装前、安装后、卸载时执行对应的动作。把这几个模块搞明白80% 的软件打包需求你已经能应对了。剩下 20% 的高阶玩法比如配置 Windows 服务、IIS 站点、驱动安装、本地化多语言属于需要时再按需查阅的范围。2.3 版本升级与维护为什么说升级日志很重要还有一个很容易被忽视的点你打包出的软件不是一次性交付它有版本生命周期。Advanced Installer 工程里专门有 Upgrade 相关的配置区域用于定义当用户安装新版本时旧版本怎么办。它可以自动卸载旧版本或者以补丁形式增量更新。我见过太多人从一开始就没有计划升级结果第一个正式版发布后一个月用户反馈新版本装不上就是因为新旧版本 GUID 冲突或者安装路径不一致。凡是正式对外发布的产品在第一次打包的时候就建议把升级策略想好。20.7.1 的升级机制已经相当成熟能根据版本号自动覆盖或移除旧文件但前提是你在工程里手动定义了升级路径而不是默认不处理。3. 实操过程与核心环节实现3.1 准备阶段把散装项目整理成一套干净的文件任何工具都拯救不了混乱的发布目录。在创建 Advanced Installer 工程之前我习惯先做一次预发布整理编译 Release 版本确保不是 Debug 版本Debug 依赖开发环境 DLL拷出去必挂。把运行所需的 DLL、配置文件、资源文件夹集中到一个临时目录。用 Dependencies或者旧版 Dependency Walker检查主程序的动态库依赖确认没有意外引入额外的第三方 DLL。编写或收集一份最终要展示给用户的安装许可协议文本License.rtf。这一步看似与打包工具无关但决定了你后面拖文件时会省多少时间。很多人失败都是因为文件目录结构混乱漏文件而不自知。3.2 新建工程与第一步配置打开 Advanced Installer 20.7.1选择New Project它会问你要哪种项目类型。我的建议是选择**Simple简单**入门之后随时可以追加功能。它指的简单不是你软件简单而是初始模板引擎简单减少干扰项。进入到主界面后第一件要做的事是设置Product Details产品信息。这里有几个关键字段需要认真填Product Name显示给用户看的软件名称不是文件名。Version版本号一定要符合语义化版本规则比如 1.0.0。版本号太随意后面升级策略会出错。Manufacturer厂商这个字段会默认成为开始菜单里出现文件夹的名称也会写入注册表的 Uninstall 项。建议写公司名或产品线名。Product Code / Upgrade Code这两个 GUID 非常重要。Product Code 每个版本都要变Upgrade Code 代表产品的家族身份同一个产品的不同版本必须保持一致。用工具自带的生成按钮即可但 Upgrade Code 设置好后千万不要随便改否则升级关系会断裂。很多老手就是在这吃暗亏Product Code 不变导致新版本安装时提示已经安装或者 Upgrade Code 变了导致旧版本无法被识别。每次重新生成安装包前我都会花十秒检查这几个字段。3.3 文件、注册表、服务与快捷方式配置接下来是重头戏。在Files and Folders里左侧树已经把目标机器的目录结构模拟出来了常见路径包括ApplicationFolder一般指向Program Files\(Manufacturer)\(ProductName)这是主程序的默认安装目录。你会注意到这个文件夹上面有个小图标表示它带有APPDIR属性它是后续快捷方式引用的核心变量。CommonAppDataFolder放所有用户共享的配置数据的目录。ProgramFilesFolder、WindowsFolder等系统目录。通常我会把软件本体拖到ApplicationFolder下把只读资源放进CommonAppDataFolder把可写的用户配置文件留在应用自己的目录里并设置对应的权限。在这个界面里右键文件可以设置Never overwrite不覆盖或Overwrite if newer只在源文件更新时覆盖这对配置文件和数据文件是保命的选项。之后在Shortcuts里新建桌面快捷方式指向ApplicationFolder下的主程序并设置图标。在Registry里按需写入注册表注意 value 的数据类型别选错字符串、DWORD32位、QWORD64位搞混会导致程序读取失败。如果你的应用需要安装为 Windows 服务在Services节点下可以添加服务指定服务名、显示名、启动类型自动/手动、运行账户。这里有个经验之谈服务的Service Name 一旦对外发布了就别改否则用户的旧服务不会被更新升级后系统里可能出现两个服务。3.4 前置依赖和运行库处理在Launch Conditions and Prerequisites里可以配置安装前检查。比如若目标机器未安装 .NET Framework 4.8则自动从网上下载安装。这个模块的策略是勾选相应的运行库组件如 VC Redistributable 2015-2022、.NET Runtime。选择Download from the Web还是Bundle from Local。本地捆绑会让安装包体积变大但离线可用适合内网分发在线下载体积小但用户必须联网而且有可能被目标机器上的安全策略拦截。我个人的建议面向普通用户就用在线下载面向企业内部就用本地捆绑。前者安装包小用户体感好后者稳定可靠不受网络限制。3.5 构建与验证所有配置完成后点Build按钮。Advanced Installer 20.7.1 的构建速度不错一个几百 MB 的项目大概十几秒到一分钟内能出包。构建完成后不要只在开发机器上测试。想验证安装包质量至少要在两到三种环境上跑一遍干净的物理 Windows 10/11无开发工具。装有同样软件旧版本的机器测试升级是否正常。虚拟机里跑一次全新安装并卸载查看卸载是否干净。我会顺手打开事件查看器确认安装日志里有没有警告或错误。Windows Installer 的日志记录比较繁琐但遇到诡异报错时可以从%TEMP%下的 MSI 日志里找到许多有价值的线索。4. Python 项目如何用好 Advanced Installer4.1 为什么用 Advanced Installer 而不是 PyInstaller这些年 Python 写桌面工具的人越来越多很多人的第一反应是用 PyInstaller 或 Nuitka 打包成 exe 就完事。这个思路没错但我得说如果你要把 Python 工具正式交付给客户或者在企业内网大规模分发Advanced Installer 反而更合适。用 PyInstaller 或 Nuitka 打包出来的本质上是绿色可执行文件双击能跑但文件散落在一堆依赖库里没有任何系统集成。客户要的往往是这个工具需要在开始菜单有快捷方式、需要写注册表授权、需要能在控制面板里卸载。这些需求 PyInstaller 自己干不了只能靠外部的打包工具。这恰恰是 Advanced Installer 的主场。4.2 把 Python 应用变为可安装程序的完整姿势具体怎么操作有两种路线。第一种是纯 PyInstaller 输出 Advanced Installer 外壳先用 PyInstaller或 Nuitka把 Python 项目打成单目录模式注意是--onedir不是--onefile因为 onefile 每次启动都要解压启动慢而且杀毒软件误报率更高然后把整个 dist 目录拖入 Advanced Installer 的 Files and Folders 里再配置快捷方式、图标、前置依赖最终打出一个标准的 EXE/MSI 安装包。第二种更 Geek 一点的方式直接用 Advanced Installer 内置的 Python 支持。它可以通过Package Configuration节点添加 Python 解释器和 pip 依赖在构建时自动拉取依赖并整合。我实测下来这个功能适合依赖少、环境简单的小工具如果项目里的库很多、有编译型依赖比如 pandas、lxml 这类还是建议先 PyInstaller 或 Nuitka 打好再外包更可控。4.3 依赖、虚拟环境和路径问题的重点建议用 Advanced Installer 包 Python 软件有几个值得注意的细节虚拟环境一定在打包前用 requirements 重新构建一遍确保环境干净不要直接拷贝你日常开发用的 site-packages。路径问题Python 程序里不要写绝对路径统一用sys.executable或Path(__file__).resolve()推导当前路径否则装到非默认目录时程序找不到资源文件。启动器脚本如果你的应用需要设置环境变量、设置工作目录可以在批处理或一个小型 exe 启动器里搞定然后用 Advanced Installer 把快捷方式指向启动器而不是直接指向 Python 主程序。退出码与日志打包前给程序加上基本的日志输出logging 配置到 AppData 下的固定路径。这样客户报问题时你能第一时间拿到日志而不是靠猜。5. 常见问题与排查技巧实录5.1 安装包做出来杀毒软件一直报毒这应该是被问到最多的问题了。不少 Python 打包出来的 exe 被 Windows Defender 或各种安全软件拦截误报率极高。排查方向有几条先用 Virustotal 上传你的安装包看看究竟是引擎误报还是真的被注入了什么。很多时候问题不在 Advanced Installer 这层而在你打包的 exe 本身。尝试关闭 UPX 压缩如果使用了不压缩或者换了编译器选项误报率能下降不少。给待分发的 exe 做数字签名。哪怕是一个便宜的 OV 证书装了签名和不签名误报率完全是两个世界。某些杀毒软件会特别关注安装程序修改注册表自启动项、修改浏览器设置这类行为如果你的安装包确实做了类似操作误报概率会增加。能不做尽量不做。5.2 老用户升级安装时提示另一个版本已安装这条我在第 3.2 节提过但真遇到时很多人还是懵。请按顺序检查新版本的Product Code是否已重新生成。每次都要变Upgrade Code是否与旧版本一致。每次都不能变新版本的Version是否大于旧版本。升级逻辑依赖版本号比较有没有在 Upgrade 配置区域里正确添加了检测旧版本并移除的策略。还有一个容易忽视的点如果你把安装包名字取得跟旧版完全一样用户在旧版本运行时想直接覆盖安装Windows Installer 会报正在使用的错。建议安装包文件名里带上版本号避免误解。5.3 安装完成后程序在部分机器上启动失败这种情况大多是目标机器缺少运行库。单机开发环境跑得好好的一到客户机器就挂十有八九是 VC 运行库或 .NET 运行时版本不一致。在 Advanced Installer 的前置依赖配置里把需要的组件选上并设置安装时检测缺失则自动安装基本能解决。还有一类冷门但让人头疼的情况客户机器上装了更老版本的某种驱动/软件和你的程序发生冲突。这种在打包层面能做的不多但至少可以在安装包中设置检查目标机器上是否已存在某软件存在则给出警告的启动条件提前告知用户而不是等装完再一堆报错。5.4 卸载后用户配置文件和数据还在很多软件为了体验卸载时会保留用户数据。但客户有时会疑惑甚至认为卸载不干净。这件事本质上是产品策略如果你确实要卸载即清除一切那在 Files and Folders 里不要把配置文件放在ApplicationFolder而是放在用户的 AppData 目录然后在卸载自定义操作里主动删除相关目录。如果不想删除也建议在卸载完成界面或说明文档里写一句已保留用户数据避免误会。6. 自动化构建与持续集成Advanced Installer 20.7.1 不是只能手动点点点它也提供命令行构建接口。对经常发版的人把打包集成到 CI/CD 里可以说是刚需。基本原理是Advanced Installer 将工程保存为.aip文件这个文件本质上是 XML 格式。命令行调用路径大致是AdvancedInstaller.com /build C:\path\to\project.aip你可以在 Jenkins、Azure DevOps 的流水线里在编译完成后自动执行这个命令然后把产出物上传到内部制品库。这比开发人员每天手动开 GUI 发版要可靠得多毕竟手动操作总有一瞬间的疏忽。我在实际项目中一般这样组织发布流水线代码提交、跑单测编译 Release 版本执行打包脚本调用 AdvancedInstaller.com 构建 MSI/EXE自动生成安装包的 SHA256 校验值方便分发后核对推送到内部服务器邮件通知测试组。这个流程落地之后发版效率能提升一个数量级人的精力省下来去做更重要的产品验证。7. 最后的经验分享做软件分发这些年我最大的体会是安装包是用户对软件的第一印象比界面第一屏的体验更前置。如果一个用户下载了你的软件双击却报错、被杀毒软件拦截、或者装完发现没有快捷方式他大概率不会再给这个产品第二次机会。Advanced Installer 20.7.1 的价值就是把这些第一印象的坑尽量填平。它没有那么难学关键是你愿不愿意在正式发版前多花半天时间把所有细节配好。如果你刚接触这个工具我的建议是很简单拿一个真实的小项目动手走一遍整理文件、新建工程、配置信息、拖入文件、建快捷方式、构建安装包、换个干净机器测试安装卸载的完整链路。走完一次比你读十篇教程都有用。踩过一两次坑之后再看文档和细节很多之前看不明白的概念一下就通了。本文还有配套的精品资源点击获取
返回列表