What is a build system, anyway?
5 months ago
- #build-systems
- #dependency-management
- #software-development
- 构建系统是定义并执行从输入数据到输出数据转换的工具,通过缓存机制提高效率。
- 转换过程被称为步骤或规则,形成依赖关系图。通常禁止循环依赖。
- 输出可以是中间产物(被其他规则使用)或最终产物(对终端用户有价值)。
- 当增量构建与完全构建结果一致时即为正确构建;若规则仅在必要时运行则为最小化构建。
- 构建系统可分为进程间(基于文件)和进程内(基于函数)两类,依赖跟踪方法不同。
- 应用式构建系统预先声明所有输入/输出;单子式系统允许动态依赖关系。
- 早期截断机制在输出与先前版本一致时跳过规则执行,提升效率。
- 重建检测确保规则仅在输入变更时运行。不健全的系统可能需要强制重运行。
- 执行器负责按依赖关系调度任务、检测变更并管理进度报告。
- 进程间构建涉及产物(输出文件)和源文件(项目特定输入)。
- 密闭构建避免系统依赖;沙盒隔离构建但不保证密闭性。
- 确定性构建在相同环境中产生相同输出;可复现构建在不同环境中达成此效果。
- 远程缓存加速构建,但需要密闭性和可复现性保证正确性。
- 构建目标指定运行哪些构建部分,通常以文件名或抽象规则名表示。
- 元构建系统(如CMake)生成构建规则,但依赖其他工具执行。
- 进程内构建面临全局状态和进程间通信的挑战,缓存实现较复杂。
- 追踪式进程内系统(查询系统)通过记录函数调用来管理依赖关系。
- 函数式响应编程(FRP)库显式声明依赖,常用于用户界面开发。
- 典型构建系统包括Make、Docker、Rustc、Shake和Ninja等。