如何用脚本快速生成项目模板

wen 实用脚本 2

从零搭建高效开发流水线

目录导读

  1. 为什么需要项目模板脚本?
  2. 主流脚本工具对比:Shell / Python / Node.js
  3. 手写一个通用模板生成脚本(含代码示例)
  4. 进阶玩法:集成CLI工具与交互式问答
  5. 常见问题与避坑指南
  6. Q&A 问答环节

为什么需要项目模板脚本?

在团队开发中,每次新建项目都要重复配置目录结构、依赖管理、ESLint、Prettier、Git忽略文件等基础环境,手动操作不仅耗时,还容易漏掉关键文件。脚本化模板生成可以:

如何用脚本快速生成项目模板

  • 一致性:确保所有项目遵循相同架构规范
  • 效率:从10分钟手工配置压缩到1秒自动生成
  • 可维护:模板更新后,只需修改脚本,无需逐个项目调整

前端项目常需 src/public/package.jsonwebpack.config.js 等文件,通过脚本封装,输入项目名即可得到完整骨架。


主流脚本工具对比

工具 适用场景 学习成本 跨平台性
Shell (Bash) Linux/macOS 环境,简单文件操作 差(需Git Bash)
Python 复杂逻辑、跨平台、数据处理 优秀
Node.js 前端项目、npm生态、交互式CLI 优秀

推荐组合

  • 小型项目/个人使用 → Shell
  • 团队协作/多平台 → Python 或 Node.js

手写一个通用模板生成脚本

1 Shell 示例(最简版本)

#!/bin/bash
# 用法: ./create_project.sh my-app
PROJECT_NAME=$1
mkdir $PROJECT_NAME && cd $PROJECT_NAME
mkdir src src/components src/utils public
touch src/index.js public/index.html .gitignore README.md
cat > package.json <<- EOF
{
  "name": "$PROJECT_NAME",
  "version": "1.0.0",
  "scripts": { "start": "node src/index.js" }
}
EOF
echo "✅ 项目 $PROJECT_NAME 创建成功"

2 Python 示例(带模板变量替换)

import os
import shutil
import sys
def create_project(name):
    template_dir = "project_template"  # 存放模板文件的目录
    target_dir = os.path.join(os.getcwd(), name)
    if os.path.exists(target_dir):
        print("❌ 目录已存在")
        return
    shutil.copytree(template_dir, target_dir)
    # 替换模板中的变量
    for root, dirs, files in os.walk(target_dir):
        for file in files:
            filepath = os.path.join(root, file)
            with open(filepath, 'r', encoding='utf-8') as f:
                content = f.read()
            content = content.replace('{{project_name}}', name)
            with open(filepath, 'w', encoding='utf-8') as f:
                f.write(content)
    print(f"✅ 项目 {name} 已生成")
if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("用法: python create_project.py <项目名>")
    else:
        create_project(sys.argv[1])

3 Node.js 示例(交互式CLI)

#!/usr/bin/env node
const inquirer = require('inquirer');
const fs = require('fs-extra');
const path = require('path');
const questions = [
  { type: 'input', name: 'projectName', message: '项目名称?' },
  { type: 'list', name: 'framework', message: '选择框架?', choices: ['React', 'Vue', 'Vanilla'] }
];
inquirer.prompt(questions).then(answers => {
  const target = path.join(process.cwd(), answers.projectName);
  fs.copySync(path.join(__dirname, 'templates', answers.framework), target);
  console.log(`✅ ${answers.projectName} 已生成`);
});

进阶玩法:集成CLI工具与交互式问答

1 发布为全局命令

将脚本封装为npm包,使用 npm link 或发布到npm registry,团队即可通过 create-my-app 命令直接使用。

2 支持多框架选择

在模板内部使用条件分支(如 Jinja2/Handlebars):

# 模板文件 package.json.hbs
{
  "name": "{{name}}",
  "dependencies": {
    "react": "18.0.0" {{#if typescript}}, "typescript": "5.0"{{/if}}
  }
}

3 自动初始化Git仓库

在脚本末尾追加:

cd $PROJECT_NAME && git init && git add . && git commit -m "Initial commit from template"

常见问题与避坑指南

  • ❌ 问题:模板文件夹路径写死,换电脑就失效
    ✅ 解决:使用 __dirnameos.path.dirname(__file__) 动态获取脚本所在目录

  • ❌ 问题:权限不足无法执行脚本
    ✅ 解决chmod +x script.sh 添加执行权限,Python/node使用 python script.pynode script.js

  • ❌ 问题:大厂项目模板过于复杂(含Docker、CI/CD配置)
    ✅ 建议:分层设计——基础模板只包含代码骨架,其他配置通过 --with-docker 参数按需附加


Q&A 问答环节

Q1:脚本模板和脚手架(如create-react-app)有什么区别?
A:脚手架通常提供更完整的集成(路由、状态管理、测试框架),但依赖特定生态;自己写脚本更灵活,适合定制化企业内部规范。

Q2:如何让脚本在Windows上也能运行?
A:Python/Node.js天然跨平台;Shell需安装Git Bash或WSL,推荐使用Node.js + fs-extra 库(处理跨平台路径)。

Q3:模板更新后,已生成的项目怎么同步?
A:不建议自动同步,更推荐:

  1. 每次新建项目都使用最新模板
  2. 对于已存在项目,提供增量更新脚本(如 upgrade-prettier-config.js

Q4:模板里能否包含私有npm包?
A:可以,但需注意权限,建议在 postinstall 脚本里触发 npm login 或使用 .npmrc 配置私有仓库地址。

Q5:有没有在线平台可以协作维护模板?
A:GitHub上搜索 project-templateboilerplate 即可找到开源项目,团队可将模板仓库设为内部私有,脚本中通过 git clone 拉取。


一个高效的项目模板生成脚本,能极大缩短重复劳动时间,让开发者专注业务逻辑,从Shell两行命令,到Node.js交互式CLI,再到Python模板引擎,技术栈的选择取决于你的团队规模和需求复杂度,立即动手,把常用项目结构固化为脚本,开启自动化开发之旅!

抱歉,评论功能暂时关闭!