Boilerplates CLI 版本演进全解:从 0.0.4 到 0.2.0 的功能地图与迁移指南
【免费下载链接】boilerplatesCreate reusable templates and turn them into configurable workloads for homelabs and self-hosted infrastructure. Free and Open-Source.项目地址: https://gitcode.com/GitHub_Trending/bo/boilerplates
Boilerplates 是一个面向家庭实验室(homelab)与自托管基础设施的开源 CLI 工具,用于创建可复用的模板并将其渲染为可配置的工作负载。本文以仓库根目录下的 CHANGELOG.md 为主体脉络,完整梳理从 0.0.4 初始公开发布到 0.2.x 版本的全部功能演进、破坏性变更与修复记录,并结合 cli/ 目录下的源码实现逐一印证每个版本承诺背后的真实机制。读完本文,你将掌握各版本之间的能力边界、template.json新模板格式的迁移要点、生成命令的完整参数体系,以及依赖矩阵验证等高级功能的底层原理。
版本脉络总览:一条通往 0.2.0 的演进主线
CHANGELOG 记录了项目遵循 Keep a Changelog 中version = "0.2.1",与 CHANGELOG 中[Unreleased]之后已经落地的 0.2.x 修复版本保持一致。整个演进大致分为三个阶段:
| 阶段 | 版本 | 主题 |
|---|---|---|
| 萌芽期 | 0.0.4 ~ 0.0.7 | 核心 CLI、模板库、Schema 1.0/1.1 |
| 平台期 | 0.1.0 ~ 0.1.2 | 多技术栈支持、Compose Schema 1.2、变量体系完善 |
| 重构期 | 0.2.0 ~ 0.2.1 | template.json 新格式、依赖矩阵验证、远程生成 |
代码仓库中对语义版本的解析与比较逻辑集中在 cli/core/version.py:parse_version()将v前缀剥离后解析为major.minor整数元组,compare_versions()与is_compatible()则据此判断当前版本是否满足模板或插件声明的版本门槛;解析失败时is_compatible()出于安全考虑默认返回False,这正是"向后兼容判定宁可从严"的工程取舍。
0.2.0:破坏性重构——template.json 新格式与库迁移
新的模板清单格式与自定义定界符
0.2.0 最核心的变更(#1768)是引入全新的模板格式:模板清单文件由template.yaml改为template.json,渲染内容必须放在必需的files/目录下,并采用自定义的 Jinja2 风格定界符——<< >>表示变量、<% %>表示块、<# #>表示注释,取代默认的 Jinja2 语法。这一变更的源码落点清晰可见:cli/core/template/template.py 中定义了TEMPLATE_MANIFEST_FILENAME = "template.json"、TEMPLATE_FILES_DIRNAME = "files"以及VARIABLE_START = "<<"等一组常量,_create_jinja_env()在构建SandboxedEnvironment时将这些定界符注入 Jinja2 环境。
同时,旧格式被显式拒绝:_find_manifest_file()在找不到template.json时,会检测template.yaml/template.yml遗留文件并抛出明确错误,提示"Legacy template manifests are incompatible with boilerplates 0.2.0"。README 的警告同样写明:0.2.0 起旧清单与.j2模板文件不再受支持。当前仓库library/目录下所有模板仍保留template.yaml+*.j2的组织方式,说明这些示例面向 0.1.x 时代,迁移到 0.2.0 时需按新格式改写。
新格式还带来了metadata.version结构化版本信息(TemplateVersionMetadata支持name、source_dep_name、source_dep_version、source_dep_digest、upstream_ref、notes字段),以及metadata.icon、metadata.draft、metadata.tags等元数据能力。
默认模板库迁移与旧路径回退
0.2.0 的另一项破坏性变更是默认库迁移(#1762):内置模板仓库从christianlempa/boilerplates切换到christianlempa/boilerplates-library,并伴随启动通知与旧/library路径回退。cli/core/config/config_manager.py 中可以看到完整的迁移实现:_migrate_boilerplates_repo_libraries()通过normalize_git_url()将 SSH/HTTPS 形式的 URL 归一化后与旧仓库地址比对,命中则把配置重写为DEFAULT_LIBRARY_URL(即boilerplates-library仓库),并通过MigrationNotice机制在 CLI 层向用户展示"运行boilerplates repo update重新同步库"的提示。
secret 变量类型与嵌套 config 元数据
变量定义层面,0.2.0 引入了secret类型(#1767),并为变量增加嵌套的config元数据,用于承载选项、占位符、滑块(slider)以及密钥自动生成(secret autogeneration)等能力。这一改动同时落地在运行时、Schema 与迁移后的模板规格中。cli/core/template/template.py 的_merge_item_config()展示了清单字段到运行时结构的归一化逻辑:config对象会原样透传,title被映射为交互提示prompt,description与title兜底互转。
0.2.0 新模板 kind:bash、python 与 static
Unreleased 区块(对应 0.2.0 系列)新增了三种面向非基础设施场景的模板 kind:
- bash kind(#1772):面向 Bash 脚本、引导流程(bootstrap flows)、维护任务与自动化片段;
- python kind(#1773):面向 Python 项目脚手架、自动化辅助工具、包与服务/工具骨架;
- static kind(#1786):面向与具体技术无关的文件与目录样板。
仓库中 cli/modules/bash/、cli/modules/python/、cli/modules/static/ 三个目录即为对应模块的载体,测试文件 tests/test_bash_module.py、tests/test_python_module.py、tests/test_static_module.py 覆盖了它们的注册与基础行为。
值得注意的设计取舍:README 明确说明初始的python与bash校验是"刻意最小化"的——CLI 只验证模板语法、已声明变量、渲染结果与适用的通用语义检查;像 Python 编译检查、Shell 语法检查、格式化或测试执行这类语言专属校验,被留待模板约定成熟后再作为后续工作补充。这也解释了为何 Unreleased 中 kind 相关条目只宣称"template kind"支持,而非语言级 lint 能力。
0.2.0 生成能力增强:命名输出、远程目标与 dry-run 体验
--name/-n:命名生成输出
#1783 为generate命令引入--name/-n参数,用于重命名顶层生成的文件或目录。cli/core/module/base_module.py 的generate()签名完整呈现了该参数的语义:"Rename top-level generated files/directories with this name",它与其他选项一并封装进GenerationConfig数据类。
--remote/--remote-path:远程生成目的地
#1765 是本版本最重量级的功能之一:通过--remote与--remote-path将渲染结果直接推送到远端服务器,内置 SSH 主机发现与 SCP 上传流程。cli/core/module/generation_destination.py 是这一能力的完整实现:
resolve_cli_destination()负责参数校验——--output与--remote互斥,--remote-path必须配合--remote使用,远端路径默认~/<slug>;resolve_remote_home_directory()通过ssh host "printf '%s' \"$HOME\""探测远端家目录;write_rendered_files_remote()将渲染文件写入本地临时暂存目录,然后依次执行ssh mkdir -p与scp -r完成上传;normalize_output_path()处理了 0.0.7 引入的路径规范化问题——Users/xcad/...这类缺前导斜杠的"伪绝对路径"会被自动补成/Users/xcad/...。
dry-run 与交互提示的体验优化
0.2.0-1 修复了generate --dry-run的一个行为缺陷:在没有提供任何目的地参数时不再追问本地还是远程,而是直接结束并输出 dry-run 专属的成功提示。0.1.0 则精简了 dry-run 输出,只展示文件、大小与状态等关键信息;--show-files参数可与--dry-run组合,以纯文本形式预览生成内容。
依赖矩阵验证与 kind 专属校验器
#1780 引入了"穷举式依赖矩阵验证"(exhaustive dependency matrix validation),用于对模板所有可达状态进行渲染校验,并支持可选的 kind 专属校验器。cli/core/validation/dependency_matrix.py 是核心实现:
DependencyMatrixBuilder首先从 section 与 variable 的needs声明中解析出结构化条件(DependencyCondition,支持=与!=两种语义、逗号分隔多值);_build_branch_value_sets()收集布尔变量、section 开关与条件涉及变量的取值集合;- 组合数不超过
MatrixOptions.max_combinations(默认 100)时执行笛卡尔积全量用例,超过时退化为约简用例(all-bools-false/all-bools-true/ 逐分支用例); _materialize_cases()通过"满足态去重"(_state_key)剔除等价状态,保证生成的验证用例集既可达又无冗余。
在validate命令层(见 cli/core/module/base_module.py),--matrix开关启用依赖矩阵,--kind开关启用 kind 专属校验。kind 校验器的实现位于 cli/core/validation/kind_validators.py,目前覆盖五个技术栈:
| 校验器 | 底层命令 | 说明 |
|---|---|---|
TerraformValidator | tofu validate/terraform validate | 优先使用 OpenTofu,需先init -backend=false |
KubernetesValidator | kubectl create --dry-run=client | 客户端 dry-run,集群不可达时降级为跳过 |
HelmValidator | helm lint | 缺少Chart.yaml时跳过 |
PackerValidator | packer validate | 自动定位.pkr.hcl或.json模板 |
AnsibleValidator | ansible-playbook --syntax-check | 通过hosts:特征识别 playbook |
这些校验器都具备"工具不可用即优雅跳过"的设计:RenderedFilesValidator基类统一管理临时目录、命令执行与失败信息组装,外部依赖缺失或网络受限导致的 provider 解析失败、集群发现失败等会被降级为 warning 而非 hard failure——从源码结构看,这是为了让校验结果可解释、可灰度,避免因环境问题阻断模板开发流程。
0.2.x 修复与发布工程:热修复归档与交互体验
0.2.0-2 修复了一个发布工程细节:发布工作流现在会生成与 tag 匹配的热修复源码归档(如boilerplates-0.2.0-2.tar.gz),即使 Python 打包将内部 post-release 版本做了规范化处理。scripts/install.sh 印证了这套发布机制的消费方——安装脚本从 GitHub Releases 下载boilerplates-<version>.tar.gz资产,校验其中存在setup.py或pyproject.toml后通过pipx install --force完成安装,支持--version指定版本与--no-auto-install跳过依赖自动安装。
0.2.0-1 修复了交互提示的默认值展示问题:交互提示现在会正确显示并保留从配置、变量文件与 CLI 覆盖加载的有效默认值,避免用户在向导中看到空值或过期值。
0.1.x:Schema 1.x 时代的能力扩张
多技术栈模板支持
0.1.0 一口气加入了五种基础设施技术栈的模板支持,均基于 Schema 1.0:Terraform(#1422)、Kubernetes(#1423)、Helm(#1424)、Ansible(#1426)、Packer(#1427)。对应模块与示例模板分别位于 cli/modules/terraform/ 与 library/terraform/(如cloudflare-dns-record、netbox-vm)、cli/modules/kubernetes/ 与 library/kubernetes/(如core-ingress、traefik-ingressroute)、cli/modules/helm/ 与 library/helm/(如certmanager、longhorn)、cli/modules/ansible/ 与 library/ansible/(如docker-install-ubuntu、ubuntu-vm-core)、cli/modules/packer/ 与 library/packer/(如proxmox-iso-ubuntu)。
Compose Schema 1.2 详解
同版本为 Compose 模块引入 Schema 1.2 的完整变量体系:
- 端口变量:
http、https、ssh、dns、dhcp、smtp——模板只提示其实际用到的端口,避免无关提问; - 专用
volume区:取代此前的swarm_volume_*变量,集中管理存储配置; resources区:配置 CPU 与内存限制;traefik_domain变量(#1362):设置一次基础域名,供所有服务复用;database_host与database_external联动:只有database_external=true时database_host才生效(依赖关系强制);email_encryption三态选项:none/ssl/tls,取代旧的email_tls与email_ssl两个布尔变量;- 移除
traefik_entrypoint与traefik_tls_entrypoint变量。
这些依赖关系的运行时校验在 0.0.7 已先行落地:validate_all()统一执行依赖校验以获得更好的错误报告,CLI 传入的变量若存在未满足的依赖会直接报错。
变量体系与显示机制
0.1.0 对变量系统做了一系列语义调整:
- 变量默认可选:只有显式声明
required: true的变量才是必填的,提示符中的(required)指示器改为(*); - section 不可再声明 required:只有变量可以 required,简化逻辑并提升可用性;
autogenerated_length属性:自定义自动生成值的长度(默认 32 字符),对应 cli/core/template/template.py 中_generate_autogenerated_values()的实现——空值变量按配置长度用secrets.choice从字母数字表生成,支持 base64 模式与自定义字符集;- Nerd Font 图标支持:通过 shortcode 替换实现模板描述中的富视觉反馈;
- 模板描述与下一步提示支持 Markdown 格式(#1471)。
这些显示能力的源码基础在 cli/core/display/ 包中,包括表格渲染(display_table.py)、图标系统(display_icons.py)、状态展示(display_status.py)等模块。
命令行体系与变量文件
0.1.0 将命令按"模板命令"与"配置命令"分为独立的帮助面板,并对命令做了字母序排序。同时引入:
--var-file标志(#1331):从 YAML 文件加载变量,用于非交互式部署;show命令支持--var与--var-file(#1421):在生成前预览变量覆盖效果;--output/-o标志(#1534):取代generate的位置参数目录,原位置参数用法被标记为 Deprecated 并计划在 0.2.0 移除。
变量覆盖的优先级链在 cli/core/module/base_module.py 的 docstring 中有明确定义(低到高):模板默认值 → 配置默认值(~/.config/boilerplates/config.yaml)→ 变量文件(--var-file)→ CLI 覆盖(--var)。0.1.0 还修复了--var值的类型转换问题(#1522)——布尔与数字字符串会被正确转换为 Python 原生类型。
validate命令的 ID 化
0.1.0 让validate命令接受模板 ID 作为位置参数(如compose validate netbox),与show等命令保持一致;0.2.0 进一步支持省略 ID 时校验整个模块(--all),并可组合--matrix、--kind、--semantic/--no-semantic、--path等选项。
0.0.x:地基时期的 CLI 与库机制
多模板库支持
0.0.7 引入多模板库支持(#1314),同时支持 git 库与本地(static)库。配置结构中每种库有独立字段:git 库需要url+directory,static 库需要path。repo系列命令(list/update/add/remove)在 README 的 Quick Start 中有完整示例:
boilerplates repo list boilerplates repo update boilerplates repo add my-templates https://github.com/user/templates \ --directory library \ --branch main boilerplates repo remove my-templates当多个库出现同名模板时,模板 ID 会被限定(qualify)为id.library_name形式(见 cli/core/template/template.py 的set_qualified_id())。
Schema 1.1 与 Docker Swarm
0.0.7 支持 Schema 1.1:network_mode提供bridge/host/macvlan三态;新增swarm模块(Unreleased 中 #1766 又为其建立了独立验证流,作为 0.2.0 中 compose/swarm 拆分的铺垫);统一的 Docker Swarm 放置约束变量(#1359)取代了原先的多变量方案;同时移除了network_enabled、ports_enabled、database_enabled三个开关变量。0.0.7 还允许必填变量独立于 section 开关存在(#1355)——即使 section 被禁用,其必填变量依然会被收集、校验并参与渲染。
依赖版本与 Python 3.9 兼容
0.0.6 与 0.0.7 将全部依赖固定到经过测试的具体版本,保证安装的一致性——0.0.6 锁定typer==0.19.2、rich==14.1.0、PyYAML==6.0.2、python-frontmatter==1.1.0、Jinja2==3.1.6;0.0.7 将 PyYAML 升至 6.0.3、rich 升至 14.2.0 以兼容 Python 3.14,并移除了Context类型注解以修复 Python 3.9 上的 RuntimeError(标记为 Critical)。0.1.2 修复了 Nix flake 缺少email-validator依赖导致的构建失败(#1573),当前 pyproject.toml 的依赖列表正是这些修复沉淀后的结果。
渲染健壮性
0.1.0 修复了两个影响产出质量的缺陷:空模板文件不再被创建(#1518),以及生成前的用户确认流程被增强(#1428)。渲染侧的实现细节同样值得注意:render()会跳过渲染后为空或仅为---的文件,_sanitize_content()会压缩连续空行并统一行尾;模板中未在template.json声明的变量会被严格校验拦截,TemplateErrorHandler还会基于错误消息给出"是否漏声明变量""是否误用旧定界符"等可操作的修复建议。
如何在当前仓库中验证版本行为
若希望亲手验证本文涉及的版本机制,可以在仓库根目录按以下方式操作(当前仓库为只读,以下均为本地运行与查看方式):
- 查看当前版本与语义版本工具:阅读 cli/core/version.py 的
parse_version/compare_versions/is_compatible,配合 tests/test_version.py 中的用例理解边界行为; - 理解新模板格式:对照 cli/core/template/template.py 中
TEMPLATE_MANIFEST_FILENAME与TEMPLATE_FILES_DIRNAME常量,以及_find_manifest_file()对旧清单的拒绝逻辑,可预演 0.2.0 迁移时必须完成的目录重组; - 演练生成参数:
generate命令的完整参数(--output、--remote、--name、--var、--var-file、--dry-run、--show-files、--quiet等)集中在 cli/core/module/base_module.py,远程上传链路的每一步(SSH 探测家目录、mkdir、SCP)可在 cli/core/module/generation_destination.py 中逐函数追踪,对应测试见 tests/test_generate_destinations.py; - 验证依赖矩阵:运行
boilerplates terraform validate cloudflare-dns-record --matrix --kind类命令前,先阅读 cli/core/validation/dependency_matrix.py 与 cli/core/validation/kind_validators.py,理解 100 组合上限、状态去重与工具缺失时的跳过策略; - 安装与升级:scripts/install.sh 展示了从 Releases 资产下载、校验、
pipx隔离安装与卸载的完整流程,也可在 README.md 的 Installation 一节查阅 Nix flake 与nix run github:christianlempa/boilerplates等替代安装方式。
结语
从 0.0.4 的初始 CLI 到 0.2.x 的template.json时代,Boilerplates 的 CHANGELOG 不仅是一份变更流水账,更是一张清晰的技术路线图:Schema 从 1.0 演进到 1.2,变量系统从"全部必填"演进到"可选默认 + 显式 required + 依赖矩阵穷举验证",生成目标从"本地目录"扩展为"SSH 远程推送",模板格式从 YAML 清单 +.j2迁移到 JSON 清单 +files/+ 自定义定界符。对使用者而言,理解这张地图意味着:升级 0.2.0 前需要完成模板格式迁移与默认库切换,部署非交互式流程时按"模板默认 → 配置 → var-file → CLI 覆盖"的优先级设计变量注入,而在编写新模板时,则可以从模板清单校验、依赖矩阵验证到 kind 专属校验器获得逐层递进的质量保障。
【免费下载链接】boilerplatesCreate reusable templates and turn them into configurable workloads for homelabs and self-hosted infrastructure. Free and Open-Source.项目地址: https://gitcode.com/GitHub_Trending/bo/boilerplates
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考