Captura 的 Cake 构建脚本:安装、运行与命令行参数完全指南
2026/9/24 1:33:39 网站建设 项目流程
  • 桌面应用
  • 屏幕录制
  • 音视频

【免费下载链接】Captura

Capture Screen, Audio, Cursor, Mouse Clicks and Keystrokes

项目地址:https://gitcode.com/gh_mirrors/ca/Captura
点击查看免费下载

本指南系统讲解 Captura 项目中以 build.cake 为核心的 Cake 自动化构建体系:如何安装 Cake 工具、如何运行构建脚本、如何使用build_version/configuration/target三个命令行参数控制构建行为,并结合scripts/目录下的源码(constants.cake、version.cake、backup.cake、apikeys.cake、choco.cake)与 appveyor.yml CI 配置,讲解版本号注入、任务依赖链与产物打包的底层原理。读完本文,你将能够独立完成 Captura 的本地构建、便携版/安装包/Chocolatey 包打包,并理解其与 CI 的协作方式。

Cake 在 Captura 中的作用

Cake(C# Make)是一个基于 C# 的跨平台构建自动化系统,构建脚本本身以 C# 编写。Captura 仓库根目录下的 build.cake 是整套构建流程的入口,它通过#l指令引用了scripts/目录下的五个辅助模块:

脚本文件职责
scripts/constants.cake定义源目录、临时目录、输出目录、解决方案路径等全局常量
scripts/backup.cake提供文件备份与恢复机制(CreateBackup/RestoreBackups
scripts/version.cake解析build_version参数并更新AssemblyInfo.cs
scripts/apikeys.cake从环境变量读取并嵌入 Imgur / YouTube API 密钥
scripts/choco.cake打包 Chocolatey 安装包

其中 scripts/constants.cake 定义了整个构建过程的关键路径常量:src(源代码目录)、temp(临时目录)、dist(输出目录)、licenseschoco,以及解决方案文件 src/Captura.sln、便携包temp/Captura-Portable.zip和安装包temp/Captura-Setup.exe

安装 Cake

在运行构建脚本之前,需要先安装 Cake 工具。Captura 的构建文档明确要求.NET Core 2.1及以上版本,然后通过 .NET 全局工具方式安装指定版本的 Cake.Tool:

dotnet tool install -g Cake.Tool --version 0.32.1

该命令将 Cake.Tool 以全局工具形式安装,安装完成后即可在任意目录直接调用dotnet-cake命令。作为佐证,CI 配置 appveyor.yml 的install阶段也执行了完全相同的命令(dotnet tool install -g Cake.Tool --version 0.32.1),说明0.32.1是项目锁定并经过 CI 验证的版本。

运行构建脚本

安装完成后,在仓库根目录直接执行:

dotnet-cake

不带任何参数时,dotnet-cake会加载当前目录下的build.cake并运行默认目标(default target)。从 build.cake 的源码可以看到,默认目标Default依次依赖Pack-PortablePack-SetupPack-Choco三个任务,也就是说一次无参数运行会完成便携版、安装版和 Chocolatey 包的完整打包流程。

构建脚本中的任务(Target)体系

build.cake 中定义了以下任务,这也是--target参数可选值的完整集合:

Task 名称依赖关系行为
Build用 MSBuild 以指定 Configuration 对解决方案执行Rebuild+Restore,使用 VS2019 工具链
Clean-Output清空dist输出目录
Populate-OutputClean-OutputBuild调用PopulateOutput()组装发布目录(见下文)
Pack-PortablePopulate-Output调用PackPortable()生成便携版 ZIP 并补齐SettingsCodecs目录
Pack-SetupPopulate-Output用 Inno Setup 编译 Inno.iss,并以/DMyAppVersion注入版本号
Pack-ChocoPack-Portable调用PackChoco()生成 Chocolatey 的 nupkg
TestBuild用 xUnit runner 运行 src/Tests/ 编译出的Captura.Tests.dll
DefaultPack-PortablePack-SetupPack-Choco本地默认构建入口
CITestPack-PortablePack-SetupPack-Choco持续集成入口(相比Default额外执行测试)

从依赖链可以看出,任务之间是流水线式的递进关系:Clean-OutputBuildPopulate-OutputPack-Portable/Pack-Setup,而Pack-Choco又依赖便携包产物,CI则在最顶层串起"测试 + 全部打包"。

PopulateOutput:发布目录的组装逻辑

PopulateOutput()函数(build.cake)负责把构建产物组装到dist目录:

  • 复制licenses目录(开源许可证文件);
  • Captura.Console/bin/<Configuration>Captura/bin/<Configuration>复制可执行文件(*.exe*);
  • 复制界面程序中的Languages(本地化语言包)与keymaps(键盘映射)目录;
  • Release 构建:复制lib依赖目录;
  • Debug 构建:额外复制所有.dll.pdb.xml文件(便于调试)。

随后PackPortable()会创建SettingsCodecs两个空目录(对应便携版行为,详见 docs/Portable.md),将整个dist压缩为temp/Captura-Portable.zip,再清理这两个目录。

命令行参数详解

build.cake 顶部通过Argument声明了两个内建参数,而版本参数则在 scripts/version.cake 中读取。三个参数的完整说明如下:

参数说明示例
build_version构建版本号。稳定版/CI 构建形如v9.0.0,预发布版形如v9.0.0-beta3。构建过程中会依据该值更新AssemblyInfo.cs--build_version=v9.0.0
configuration构建配置:ReleaseDebug,默认Release--configuration=Release
target要运行的构建任务,取值见上文任务表(见 build.cake)--target=CI

标准用法示例:

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

build_version:版本号解析与 AssemblyInfo 注入

build_version是三个参数中逻辑最复杂的一个,其处理实现在 scripts/version.cake:

  1. 首先通过Argument<string>("build_version", "v0.0.0")读取参数,缺省值为v0.0.0(该脚本注释说明version参数名已被 cake.exe 自身占用,因此这里命名为build_version);
  2. 用两个正则校验格式:
    • 稳定版:^v\d+\.\d+\.\d+$,匹配后去掉开头的vv9.0.09.0.0);
    • 预发布版:^v\d+\.\d+\.\d+-[^\s]+$,匹配后取-之前的部分再去掉vv9.0.0-beta39.0.0);
    • 两者都不匹配则抛出ArgumentException("Invalid Version Format", "build_version"),直接终止构建;
  3. src/Captura/Properties/AssemblyInfo.cssrc/Captura.Console/Properties/AssemblyInfo.cs两个文件执行UpdateVersion()——先用CreateBackup备份到temp目录,再通过正则定位AssemblyVersion(...)属性并替换为解析后的版本号。

因此构建完成后,程序集版本号(如当前仓库中默认的AssemblyVersion("0.0.0"),见 src/Captura/Properties/AssemblyInfo.cs)会被动态改写为build_version对应的正式版本号。同时 scripts/backup.cake 的Teardown机制保证:无论构建成功与否,脚本结束时都会把备份文件恢复回去,避免源仓库中的AssemblyInfo.cs被永久污染。

configuration:Release 与 Debug 的行为差异

configuration参数(默认Release)不仅传给 MSBuild 控制编译配置,还直接影响构建脚本本身的逻辑分支:

  • PopulateOutput的差异:Debug 构建复制全部.dll/.pdb/.xml文件,Release 构建只复制lib目录(build.cake);
  • API 密钥嵌入Setup阶段会判断if (configuration == Release),仅 Release 构建执行EmbedApiKeys()(build.cake)。

EmbedApiKeys()(scripts/apikeys.cake)的原理是:用正则Get\("(.*)"\)扫描 src/Captura.Core/ApiKeys.cs,收集所有形如Get("xxx")的占位调用,然后检查同名环境变量是否存在,存在则把占位符替换为环境变量中的真实值。这解释了 docs/Build.md 中"开发期从环境变量读取、生产构建嵌入应用"的设计:对应环境变量为imgur_client_idyt_client_idyt_client_secret(分别对应 Imgur 与 YouTube 上传功能,仅在需要相应上传能力时才必须提供)。

与 CI 的集成方式

appveyor.yml 展示了 Cake 脚本在持续集成中的真实调用方式:

  • CI 镜像固定为Visual Studio 2019install阶段安装 Cake.Tool 与 Inno Setup;
  • build_script阶段根据是否为 tag 构建决定版本号:tag 构建直接使用 tag 名作为build_version(如v9.0.0),非 tag 构建则生成v0.0.<构建号>形式的版本号;
  • 无论哪种情况,最终都执行dotnet-cake --target=CI --configuration=<配置> --build_version=<版本>
  • 构建产物(temp/Captura-Portable.ziptemp/Captura-Setup.exetemp/captura.*.nupkg)被收集为 artifacts,Release + tag 构建时自动部署到 GitHub Releases 与 Chocolatey(对应 choco/captura.nuspec 与 scripts/choco.cake 中基于便携包哈希计算校验和并写入tools/chocolateyinstall.ps1的打包逻辑)。

关于本地构建的前置条件(Visual Studio 2019 及 .NET 桌面开发工作负载、.NET Core 2.1+、FFmpeg 下载等),可进一步参考 docs/Build.md;CI 构建与 dev build 获取方式见 docs/CI.md。

小结

Captura 的 Cake 构建体系将"编译、测试、组装发布目录、打包便携版/安装包/Chocolatey 包"整合为一条清晰的任务流水线。日常使用只需记住三个要点:用dotnet tool install -g Cake.Tool --version 0.32.1安装工具、在仓库根目录执行dotnet-cake、按需通过--build_version/--configuration/--target控制版本号、构建配置与目标任务。若要深入理解每个环节,build.cake 与scripts/目录下的五个.cake模块即是完整的源码级参考。

  • 桌面应用
  • 屏幕录制
  • 音视频

【免费下载链接】Captura

Capture Screen, Audio, Cursor, Mouse Clicks and Keystrokes

项目地址:https://gitcode.com/gh_mirrors/ca/Captura
点击查看免费下载

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

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

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

立即咨询