如何用脚本自动检查代码规范?

wen 实用脚本 2

本文目录导读:

如何用脚本自动检查代码规范?

  1. 使用 ESLint(JavaScript/TypeScript)
  2. 使用 Prettier(代码格式化)
  3. Husky + lint-staged(Git提交前检查)
  4. Python 代码检查(Flake8 + Black)
  5. 使用 GitHub Actions(CI自动检查)
  6. 完整的 Shell 脚本示例
  7. 配置文件自动化
  8. 使用建议

我来介绍几种常见的自动检查代码规范的方法和工具配置方案。

使用 ESLint(JavaScript/TypeScript)

安装和配置

# 安装 ESLint
npm install eslint --save-dev
# 初始化配置
npx eslint --init

配置文件示例 (.eslintrc.js)

module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true,
  },
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:@typescript-eslint/recommended',
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaFeatures: {
      jsx: true,
    },
    ecmaVersion: 12,
    sourceType: 'module',
  },
  plugins: ['react', '@typescript-eslint'],
  rules: {
    'indent': ['error', 2],
    'quotes': ['error', 'single'],
    'semi': ['error', 'always'],
    'no-unused-vars': 'error',
    'no-console': 'warn',
  },
};

运行脚本

{
  "scripts": {
    "lint": "eslint src/",
    "lint:fix": "eslint src/ --fix"
  }
}

使用 Prettier(代码格式化)

安装和配置

npm install prettier --save-dev

配置文件 (.prettierrc)

{
  "semi": true,
  "trailingComma": "es5",
  "singleQuote": true,
  "printWidth": 80,
  "tabWidth": 2,
  "useTabs": false
}

自动格式化脚本

{
  "scripts": {
    "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,scss}\"",
    "format:check": "prettier --check \"src/**/*.{js,jsx,ts,tsx,json,css,scss}\""
  }
}

Husky + lint-staged(Git提交前检查)

安装

npm install husky lint-staged --save-dev
npx husky install

配置 package.json

{
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{json,css,scss,md}": ["prettier --write"]
  }
}

配置 Husky 钩子

# 创建 pre-commit 钩子
npx husky add .husky/pre-commit "npx lint-staged"

Python 代码检查(Flake8 + Black)

安装

pip install flake8 black isort

配置文件 (.flake8)

[flake8]
max-line-length = 88
extend-ignore = E203, W503
exclude = .git,__pycache__,build,dist

运行脚本

# check_code.py
import subprocess
import sys
def run_flake8():
    result = subprocess.run(
        ['flake8', 'src/', 'tests/'],
        capture_output=True,
        text=True
    )
    if result.returncode != 0:
        print("Flake8 检查结果:")
        print(result.stdout)
        print(result.stderr)
        return False
    return True
def run_black():
    result = subprocess.run(
        ['black', '--check', 'src/', 'tests/'],
        capture_output=True,
        text=True
    )
    if result.returncode != 0:
        print("Black 格式检查结果:")
        print(result.stdout)
        return False
    return True
def run_isort():
    result = subprocess.run(
        ['isort', '--check-only', 'src/', 'tests/'],
        capture_output=True,
        text=True
    )
    if result.returncode != 0:
        print("isort 导入排序检查:")
        print(result.stdout)
        return False
    return True
if __name__ == "__main__":
    checks = [
        ("Flake8", run_flake8),
        ("Black", run_black),
        ("isort", run_isort)
    ]
    all_passed = True
    for name, check_func in checks:
        print(f"正在运行 {name}...")
        if not check_func():
            all_passed = False
            print(f"❌ {name} 检查失败")
        else:
            print(f"✅ {name} 检查通过")
    sys.exit(0 if all_passed else 1)

使用 GitHub Actions(CI自动检查)

配置文件 (.github/workflows/lint.yml)

name: Code Quality Check
on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]
jobs:
  lint:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [16.x, 18.x]
    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
    - name: Install dependencies
      run: npm ci
    - name: Run ESLint
      run: npm run lint
    - name: Run Prettier check
      run: npm run format:check

完整的 Shell 脚本示例

check-code-quality.sh

#!/bin/bash
set -e
echo "=== 代码质量检查开始 ==="
echo ""
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 记录失败数量
FAILURES=0
# JavaScript/TypeScript 检查
check_js() {
    echo -e "${YELLOW}[1/4] 运行 ESLint...${NC}"
    if npx eslint src/ --max-warnings=0; then
        echo -e "${GREEN}  ✅ ESLint 检查通过${NC}"
    else
        echo -e "${RED}  ❌ ESLint 检查失败${NC}"
        ((FAILURES++))
    fi
    echo -e "${YELLOW}[2/4] 检查代码格式...${NC}"
    if npx prettier --check "src/**/*.{js,jsx,ts,tsx}"; then
        echo -e "${GREEN}  ✅ Prettier 格式检查通过${NC}"
    else
        echo -e "${RED}  ❌ Prettier 格式检查失败${NC}"
        ((FAILURES++))
    fi
}
# Python 检查
check_python() {
    echo -e "${YELLOW}[3/4] 运行 Flake8...${NC}"
    if flake8 src/ tests/; then
        echo -e "${GREEN}  ✅ Flake8 检查通过${NC}"
    else
        echo -e "${RED}  ❌ Flake8 检查失败${NC}"
        ((FAILURES++))
    fi
    echo -e "${YELLOW}[4/4] 类型检查...${NC}"
    if mypy src/; then
        echo -e "${GREEN}  ✅ mypy 类型检查通过${NC}"
    else
        echo -e "${RED}  ❌ mypy 类型检查失败${NC}"
        ((FAILURES++))
    fi
}
# 检测项目类型
if [ -f "package.json" ]; then
    check_js
fi
if [ -f "setup.py" ] || [ -f "requirements.txt" ]; then
    check_python
fi
echo ""
echo "=== 代码质量检查结束 ==="
if [ $FAILURES -eq 0 ]; then
    echo -e "${GREEN}🎉 所有检查通过!${NC}"
    exit 0
else
    echo -e "${RED}❌ $FAILURES 个检查项失败${NC}"
    exit 1
fi

配置文件自动化

初始化脚本 init-lint.sh

#!/bin/bash
echo "正在初始化代码规范检查工具..."
# 创建配置文件
cat > .eslintrc.js << 'EOF'
module.exports = {
  extends: ['eslint:recommended'],
  rules: {
    'no-console': 'warn',
    'no-unused-vars': 'error',
  },
};
EOF
cat > .prettierrc << 'EOF'
{
  "singleQuote": true,
  "trailingComma": "all",
  "printWidth": 80,
  "tabWidth": 2
}
EOF
# 更新 package.json
if [ -f "package.json" ]; then
    npm install --save-dev eslint prettier husky lint-staged
    # 添加脚本
    node -e "
    const pkg = require('./package.json');
    pkg.scripts = {
      ...pkg.scripts,
      'lint': 'eslint src/',
      'format': 'prettier --write \"src/**/*.{js,jsx,ts,tsx}\"',
      'format:check': 'prettier --check \"src/**/*.{js,jsx,ts,tsx}\"',
      'prepare': 'husky install'
    };
    require('fs').writeFileSync('package.json', JSON.stringify(pkg, null, 2));
    "
    # 初始化 husky
    npx husky install
    npx husky add .husky/pre-commit "npx lint-staged"
fi
echo "✅ 初始化完成!"

使用建议

  1. 持续集成:将检查脚本集成到 CI/CD 流程中
  2. 渐进式采用:先对新增代码进行检查,逐渐覆盖旧代码
  3. 团队统一:使用统一的配置文件和规则
  4. 自动修复:配置 --fix 参数自动修复简单问题
  5. 忽略文件:使用 .eslintignore.prettierignore 排除不需要检查的文件

这样的自动化检查流程能有效保证代码质量和一致性。

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