通用项目脚手架(Universal Project Scaffold)
概述
项目初始化是决定长期维护成本的关键时刻。缺少 .gitignore 的仓库、没有 lint 的代码库、没有测试目录的项目——这些问题越晚修复成本越高。本技能提供跨技术栈的脚手架最佳实践,覆盖目录结构、配置文件、代码质量工具链和持续集成(CI)基础设施。
标准目录结构
project-root/
├── src/ # 源代码
├── tests/ # 测试文件,与 src/ 镜像结构
├── docs/ # 项目文档
├── scripts/ # 构建、部署、数据迁移等脚本
├── .github/ # GitHub Actions 工作流
│ └── workflows/
├── .gitignore # Git 忽略规则
├── .editorconfig # 编辑器统一配置
├── .env.example # 环境变量模板(不含真实值)
├── README.md # 项目说明
├── LICENSE # 许可证
└── Makefile # 常用命令入口(可选)
必备配置文件
| 文件 | 用途 | 注意事项 |
|---|---|---|
.gitignore |
排除构建产物、依赖、密钥文件 | 使用 gitignore.io 生成基础模板,按技术栈定制 |
.editorconfig |
统一缩进、换行符、字符编码 | 跨编辑器生效,团队协作必备 |
README.md |
项目概述、安装步骤、运行方法、贡献指南 | 至少包含安装和运行两节 |
LICENSE |
法律许可声明 | MIT(宽松)、Apache 2.0(专利保护)、GPL(强传染) |
.env.example |
环境变量模板 | 列出所有必需变量,值留空或填示例 |
代码质量工具链(Linting / Formatting)
| 技术栈 | 格式化工具(Formatter) | 检查工具(Linter) | 备注 |
|---|---|---|---|
| JavaScript / TypeScript | Prettier | ESLint(flat config 格式) | 使用 eslint.config.js |
| Python | ruff format | ruff check | 替代 flake8 + black + isort |
| Go | gofmt | golangci-lint | 零配置内置 |
| Rust | rustfmt | clippy | cargo 子命令集成 |
CI 基础模板(GitHub Actions)
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup # 根据技术栈选择 Node / Python / Go 等
- name: Install dependencies
- name: Lint
- name: Test
关键原则:第一个提交(commit)就应包含 CI 配置,即使只运行 lint。
Pre-commit 钩子(Hooks)
使用 pre-commit 框架在提交前自动执行质量检查:
- 安装:
pip install pre-commit或brew install pre-commit - 创建
.pre-commit-config.yaml配置文件 - 执行
pre-commit install激活钩子 - 推荐钩子:
trailing-whitespace、end-of-file-fixer、detect-secrets、check-merge-conflict
环境变量管理(.env.example 模式)
# .env.example — 复制为 .env 并填入真实值
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
API_KEY=your-api-key-here
DEBUG=false
管理规则:
- 创建
.env.example,列出所有环境变量名和示例值 - 将
.env加入.gitignore,绝不提交真实密钥 - 项目启动脚本检查必需变量是否存在,缺失时报错退出
- 文档中说明每个变量的用途和获取方式
决策矩阵:Monorepo vs Polyrepo
| 维度 | Monorepo(单仓库) | Polyrepo(多仓库) |
|---|---|---|
| 适用场景 | 多包共享代码频繁、统一发布节奏 | 独立服务、独立部署周期 |
| 依赖管理 | 内部依赖即时同步 | 通过版本号解耦 |
| CI 复杂度 | 需增量构建,避免全量触发 | 每个仓库独立 CI,简单直接 |
| 工具要求 | Turborepo / Nx / pnpm workspace | 标准 Git 工作流即可 |
| 推荐选择 | 前端组件库、全栈应用 | 微服务架构、跨团队协作 |
工作流
- 使用脚手架工具或模板仓库创建项目骨架
- 配置
.gitignore、.editorconfig、LICENSE - 设置代码质量工具(linter + formatter)并写入配置文件
- 创建
.env.example,定义所有环境变量 - 配置 pre-commit 钩子并执行
pre-commit install - 编写最小化 CI 工作流(至少包含 lint + test)
- 完善
README.md(安装、运行、贡献指南) - 首次提交,确认 CI 通过
必须做(MUST DO)
- 第一个提交就包含
.gitignore和README.md - 配置至少一个 lint 工具并添加到 CI
- 创建
tests/目录,即使暂时为空 - 提供
.env.example,不让新成员猜配置 - 提交 lock 文件(
package-lock.json、uv.lock等)确保可复现构建
禁止做(MUST NOT DO)
- 禁止将
.env、密钥文件、node_modules、__pycache__提交到版本控制 - 禁止跳过
.gitignore——"以后再加"意味着永远不加 - 禁止使用无 lock 文件的依赖管理
- 禁止在没有格式化配置的情况下开始多人协作
- 禁止将 CI 配置推迟到"以后再说"
常见错误
| 错误 | 后果 | 修复方法 |
|---|---|---|
没有 .gitignore |
node_modules 被提交,仓库膨胀 |
立即添加,用 git rm -r --cached 清理 |
| 没有 lint 配置 | 代码风格不一致,PR 评审变成格式争论 | 选一个工具,配置好,全员统一 |
没有 tests/ 目录 |
心理暗示"这个项目不需要测试" | 创建目录 + 写第一个冒烟测试(Smoke Test) |
.env 被提交 |
密钥泄露到 Git 历史,清除极其困难 | 用 git filter-branch 或 BFG 清理历史 |
| 没有 README | 三个月后自己都不记得怎么跑项目 | 立即写,花 5 分钟能省 5 小时 |