Captura 安装包构建全指南:Inno Setup 配置解析与发布流水线实践
2026/9/23 12:27:54 网站建设 项目流程

Captura 安装包构建全指南:Inno Setup 配置解析与发布流水线实践

【免费下载链接】CapturaCapture Screen, Audio, Cursor, Mouse Clicks and Keystrokes项目地址: https://gitcode.com/gh_mirrors/ca/Captura

Captura 使用 Inno Setup 来生成 Windows 安装程序(Setup 安装包)。本文以 docs/Setup.md 为纲领,逐段拆解仓库根目录下的 Inno.iss 安装脚本,并结合 Cake 构建脚本、AppVeyor 持续集成配置,完整还原从源码到Captura-Setup.exe的打包与发布链路。读完本文,你将掌握 Inno Setup 脚本各段落的实际含义、Captura 安装包的产物来源与输出位置,以及如何在本地或 CI 环境中一键产出安装包。

一、为什么选择 Inno Setup

官方说明 docs/Setup.md 只有一句话:Captura 的安装程序由Inno Setup构建。这一点在 docs/Acknowledgements.md 中也得到印证:

Setup files for Captura are built using Inno Setup.

Inno Setup 是一款开源、免费的 Windows 安装程序制作工具,其核心优势在于:

  • 使用类 Pascal 的脚本语言(.iss)描述安装逻辑,配置直观、可版本化管理;
  • 原生支持 LZMA 压缩、多语言安装界面、任务与快捷方式管理等常见需求;
  • 与命令行工具ISCC深度集成,适合在 Cake / CI 流水线中无界面调用。

因此 Captura 的安装包配置被完整收纳在仓库根目录的 Inno.iss 中,随源码一同进行版本控制。

二、Inno.iss 脚本逐段拆解

仓库根目录的 Inno.iss 是安装包的唯一配置来源,全文约 60 行,结构清晰,下面按段解析。

2.1 头部宏定义(Preprocessor Directives)

; Override version before compiling ;#define MyAppVersion "6.0.0" #define MyAppName "Captura" #define MyAppPublisher "Mathew Sachin" #define MyAppURL "https://MathewSachin.github.io/Captura" #define MyAppExeName "captura.exe"
作用
MyAppVersion(默认被注释)应用版本号;注释中明确提示在编译前覆盖(Override version before compiling),实际值由构建流水线在调用 ISCC 时注入
MyAppNameCaptura应用显示名称,贯穿 [Setup]、[Icons] 等段落
MyAppPublisherMathew Sachin发布者信息,写入安装包元数据
MyAppURL项目主页用于 PublisherURL / SupportURL / UpdatesURL
MyAppExeNamecaptura.exe主程序可执行文件名,供快捷方式与运行段引用

其中MyAppVersion与构建流水线关系最密切:Cake 构建脚本通过-build_version参数(如v9.0.0v9.0.0-beta3)控制版本,可以推断在编译安装脚本前会用该版本值覆盖MyAppVersion宏,从而保证安装包版本号与 docs/Changelogs 中登记的版本保持一致。

2.2 [Setup] 段:安装包全局属性

[Setup] AppId={{C1670C5E-5042-4300-9491-6BFFF963823F} AppName={#MyAppName} AppVersion={#MyAppVersion} AppVerName={#MyAppName} v{#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\{#MyAppName} DisableProgramGroupPage=yes OutputBaseFilename=Captura-Setup Compression=lzma SolidCompression=yes SetupIconFile=src/Captura/Images/Captura.ico OutputDir=temp

逐项说明:

  • AppId:安装的全局唯一标识(GUID)。它决定了"同一应用的升级安装"识别逻辑,升级时不能随意更改,否则会被系统视为两个不同程序。

  • AppName / AppVersion / AppVerName:应用名、版本号及"名称 + 版本"的展示形式。

  • AppPublisher / AppPublisherURL / AppSupportURL / AppUpdatesURL:发布者与官方/支持/更新链接,写入安装包属性页。

  • DefaultDirName:默认安装目录,{pf}是 Inno 内置常量,指Program Files目录,即默认安装到Program Files\Captura

  • DisableProgramGroupPage=yes:禁用"选择程序组"页面,安装过程中不询问开始菜单文件夹。

  • OutputBaseFilename:安装包输出文件名,最终产物为Captura-Setup.exe

  • Compression=lzma / SolidCompression=yes:使用 LZMA 压缩算法并启用固态压缩,以减小安装包体积。

  • SetupIconFile:安装程序图标,指向 src/Captura/Images/Captura.ico,与应用自身图标复用。

  • OutputDir=temp:安装包输出到temp目录。这与构建脚本 scripts/constants.cake 中的定义严格对应:

    readonly var SetupPath = tempFolder + File("Captura-Setup.exe");

    也与 appveyor.yml 中声明的 CI 制品路径temp/Captura-Setup.exe完全一致,形成"脚本输出 → Cake 定位 → CI 收集"的闭环。

2.3 [Languages] 段:多语言安装界面

[Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl" Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" Name: "french"; MessagesFile: "compiler:Languages\French.isl" Name: "german"; MessagesFile: "compiler:Languages\German.isl" Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl"

安装程序内置 14 种语言界面:英语、丹麦语、荷兰语、芬兰语、法语、德语、希伯来语、意大利语、挪威语、波兰语、葡萄牙语、俄语、西班牙语、乌克兰语。compiler:前缀表示消息文件来自 Inno Setup 编译器自带的语言包,无需额外下载。安装时会根据系统区域自动选择语言,也可手动切换。

2.4 [Tasks] 段:可选安装任务

[Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

定义"创建桌面图标"任务,默认不勾选Flags: unchecked),用户可自愿勾选。{cm:...}是 Inno 的本地化消息引用,会自动按 [Languages] 段所选语言显示对应文案。

2.5 [InstallDelete] 段:升级前清理旧文件

; Remove Assemblies from previous installation to prevent conflicts [InstallDelete] Type: files; Name: "{app}\lib\*.dll"

安装(升级)开始时删除安装目录lib子目录下所有旧 DLL。注释明确说明意图:移除旧版本程序集,避免与新版程序集发生冲突——这是 .NET 应用升级安装时防止"版本残留导致加载异常"的常见做法。

2.6 [Files] 段:打包内容来源

[Files] Source: "dist\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

这是安装包的核心内容声明:

  • Source:从dist\*收集全部文件(该目录由构建流水线在打包前准备,汇集编译产物);
  • DestDir:安装到应用目录{app}
  • Flagsignoreversion(不依赖文件版本比对,直接用新文件覆盖)、recursesubdirs(递归包含子目录)、createallsubdirs(保持目录结构)。

2.7 [Icons] 段:快捷方式

[Icons] Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
  • 第一条:为所有用户({commonprograms})在开始菜单创建Captura快捷方式,指向{app}\captura.exe
  • 第二条:在公共桌面({commondesktop})创建快捷方式,但仅在用户勾选desktopicon任务时生效。

2.8 [Run] 段:安装完成后的动作

[Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

安装完成后提供"运行 Captura"选项:postinstall表示显示在安装完成页面,nowait表示启动后不等待程序退出,skipifsilent表示静默安装时自动跳过启动动作。StringChange(MyAppName, '&', '&&')是对按钮文案中&字符的转义处理。

三、从源码到安装包:构建与发布流水线

有了 Inno.iss 脚本,安装包的产出还需要"准备dist产物 + 调用 ISCC 编译"两个环节,这两步由 Cake 构建脚本与 AppVeyor CI 协作完成。

3.1 本地构建:Cake 脚本

前置条件参考 docs/Build.md:

  • Visual Studio 2019 或更新版本(含 .NET 桌面开发工作负载);
  • .NET Core 2.1 或更高版本;
  • Cake 工具:dotnet tool install -g Cake.Tool --version 0.32.1

安装 docs/Cake.md 说明,运行构建:

dotnet-cake --target=CI --configuration=Release

主要参数:

参数说明
-build_version构建版本,如v9.0.0(稳定版)或v9.0.0-beta3(预发布版),构建时会据此更新各项目的 AssemblyInfo
-configurationRelease 或 Debug
-target要执行的 Cake Task

执行CI目标后,安装包即出现在temp/Captura-Setup.exe(见 scripts/constants.cake)。

3.2 持续集成:AppVeyor

仓库使用 AppVeyor 做 CI(详见 docs/CI.md)。关键配置在 appveyor.yml:

install: - dotnet tool install -g Cake.Tool --version 0.32.1 - choco install innosetup -y --no-progress build_script: - ps: >- ... dotnet-cake --target=CI --configuration=$env:CONFIGURATION --build_version=$tag

两个细节值得注意:

  1. Inno Setup 由 Chocolatey 安装choco install innosetup保证了 CI 环境具备ISCC编译器,与构建脚本协同完成.iss.exe的编译;
  2. tag 构建触发发布:推送 git tag(如v9.0.0)时,以该 tag 作为-build_version执行 CI 构建;非 tag 提交则使用v0.0.{构建号}作为开发版本。

构建产物声明在artifacts段:

artifacts: - path: temp/Captura-Portable.zip name: Portable - path: temp/Captura-Setup.exe name: Setup - path: temp/captura.*.nupkg name: Chocolatey

temp/Captura-Setup.exe即 Inno Setup 脚本的输出,被 AppVeyor 收集为Setup制品。Release 配置下的 tag 构建会进一步将 Portable 与 Setup 两个制品部署到 GitHub Releases(草稿),同时将 Chocolatey 包推送到 Chocolatey 源。

日常获取开发版安装包的方式见 docs/CI.md:进入 AppVeyor 项目页面选择 Debug/Release 构建,打开Artifacts选项卡下载 Portable 或 Setup 版本即可(注意开发版仅用于测试,可能不稳定)。

四、安装包相关的配套发布形态

安装程序不是 Captura 唯一的交付形态,了解配套渠道有助于完整理解 docs/Setup.md 所述"安装包"在整个发布体系中的位置。

4.1 便携版(Portable)

从 v9.0.0 起,便携版的约定见 docs/Portable.md:

  • 设置默认保存在应用目录的Settings文件夹,删除该文件夹后回退到%AppData%\Captura,也可用--settings命令行参数覆盖;
  • FFmpeg 默认下载到应用目录的Codecs文件夹,删除后回退到%LocalAppData%\Captura
  • 在设置 FFmpeg 目录、Settings 目录或输出目录时,可用%CAPTURA_PATH%指代应用目录,例如%CAPTURA_PATH%/Settings

便携版与 Setup 版共用同一套编译产物,只是打包方式不同(zip 而非安装程序)。

4.2 Chocolatey 包

Chocolatey 包由 Cake 构建脚本生成,并在 tag 构建时由 AppVeyor 自动部署(配置见 choco/captura.nuspec 与 choco/tools/chocolateyinstall.ps1)。安装命令:

choco install captura -y

详见 docs/Choco.md。

五、小结与验证

回顾整条安装包生产链路:

  1. 构建系统产出应用文件并汇集到dist目录;
  2. Inno.iss 通过[Files]段将dist\*全量打入安装包,并配好默认目录(Program Files)、14 种语言界面、桌面图标任务、旧版本 DLL 清理与安装后启动选项;
  3. 版本号在编译前由流水线注入(覆盖MyAppVersion宏);
  4. ISCC 将脚本编译为temp/Captura-Setup.exe(scripts/constants.cake);
  5. AppVeyor 将该文件作为 Setup 制品收集并随 tag 构建发布(appveyor.yml)。

验证方法也很直观:本地执行dotnet-cake --target=CI --configuration=Release后检查temp目录是否生成Captura-Setup.exe;在 CI 页面查看 Artifacts 选项卡是否出现 Setup 制品。若需调整安装行为(如默认安装目录、新增语言、是否默认创建桌面图标),只需修改 Inno.iss 对应段落即可,改动会随源码一并纳入版本控制,保证每次构建的安装包行为可追溯、可复现。

【免费下载链接】CapturaCapture Screen, Audio, Cursor, Mouse Clicks and Keystrokes项目地址: https://gitcode.com/gh_mirrors/ca/Captura

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询