← 中文资源

简体中文版本

用变量替换从模板生成项目脚手架

建带定界占位符的模板目录,安全替换变量避免正则注入,并验证产物可用。

阅读英文原文

目标

手工复制的起始项目迟早漏改一处名字——包名里、容器标签里、日志前缀里。定界占位符加字面量替换把起始项目变成模板,收尾的冒烟检查则把每次脚手架都变成“这份拷贝确实能跑”的证明。再配上周度金丝雀,模板漂移几天内就可见而不是几个季度后炸。

步骤要点

  1. 先 grep 统计起始项目里所有变化值的分布:slug 出现多少次在哪些文件、帕斯卡名多少次,列出待参数化清单。
  2. 用 sed 把两类值全部替换成 {{service_slug}} 与 {{service_name_pascal}} 定界占位符,计数核对无遗漏。
  3. 实现字面量替换器:split/join 替代正则替换,值里的点号美元符反斜杠都不可能破坏输出;文件名同样参与替换,node_modules 与 .git 排除。
  4. 写文件之前先校验:slug 必须匹配 ^[a-z][a-z0-9-]{2,30}$,目标目录已存在就拒绝覆盖,拼写错误永远不会半生成一个项目。
  5. 脚手架最后一步跑冒烟:npm install 加 test 加 build,端到端证明产物是可工作服务;grep 旧名字应为零。

排错提示

替换弄坏含特殊字符的文件是正则把 $ 与反斜杠当元字符了,改 split/join 或字符串形式的 replaceAll,字面量天然安全;二进制文件被文本遍历弄坏就按扩展名跳过,或在缓冲里检测 NUL 字节原样复制;模板与起始项目漂移就在 CI 里每周从模板生成金丝雀项目跑冒烟,起始项目有大改时重新生成模板而不是手工编辑占位符。

适用边界

模板只能编码一种受祝福的起点,服务形态分叉时要么多模板要么脚手架后置旗标,别堆占位符;冒烟检查证明的是今天的模板,依赖漂移仍靠周度金丝雀兜住。

代码示例

# templatize the known-good starter
find starter -type f -exec sed -i \
  "s/acme-orders/{{service_slug}}/g; \
   s/AcmeOrders/{{service_name_pascal}}/g" {} +

# scaffold with validation + smoke
node scaffold.mjs billing-api
cd billing-api && npm install && npm test && npm run build
# -> SCAFFOLD OK

# grep for leaks: should be zero
grep -rn "acme" billing-api/ | wc -l   # 0