本文目录导读:

使用现有工具的组合脚本
前端项目 (JavaScript/TypeScript)
#!/bin/bash
# format.sh - 前端代码格式化脚本
# 安装依赖先
echo "📦 检查依赖..."
npm install prettier eslint --save-dev 2>/dev/null
echo "🎨 开始格式化代码..."
# 使用 Prettier 格式化
npx prettier --write "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}"
# 使用 ESLint 修复
npx eslint "src/**/*.{js,jsx,ts,tsx}" --fix
echo "✅ 格式化完成!"
Python 项目
#!/usr/bin/env python3
# format.py - Python代码格式化脚本
import subprocess
import sys
import os
def format_python():
print("🎨 格式化Python代码...")
# 使用 black 格式化
subprocess.run(["black", "."], check=False)
# 使用 isort 排序导入
subprocess.run(["isort", "."], check=False)
# 使用 ruff 检查和修复
subprocess.run(["ruff", "check", "--fix", "."], check=False)
print("✅ 格式化完成!")
if __name__ == "__main__":
if not all(
os.system(f"which {tool} > /dev/null 2>&1") == 0
for tool in ["black", "isort", "ruff"]
):
print("请安装: pip install black isort ruff")
sys.exit(1)
format_python()
通用多语言格式化脚本
#!/bin/bash
# format_all.sh - 多语言代码格式化脚本
set -e
echo "🚀 开始代码格式化"
# 根据文件类型选择格式化工具
format_file() {
local file="$1"
case "$file" in
*.py)
black "$file"
isort "$file"
;;
*.js|*.jsx|*.ts|*.tsx)
npx prettier --write "$file"
npx eslint --fix "$file" 2>/dev/null || true
;;
*.java)
# 需要安装 google-java-format
google-java-format -i "$file"
;;
*.go)
gofmt -w "$file"
;;
*.rs)
rustfmt "$file"
;;
*.c|*.cpp|*.h|*.hpp)
clang-format -i "$file"
;;
*.rb)
rubocop -a "$file" 2>/dev/null || true
;;
*.swift)
swift format -i "$file"
;;
*)
echo "⚠️ 不支持的文件类型: $file"
return 1
;;
esac
}
# 递归格式化目录
format_directory() {
local dir="$1"
find "$dir" -type f \( \
-name "*.py" -o \
-name "*.js" -o \
-name "*.ts" -o \
-name "*.java" -o \
-name "*.go" -o \
-name "*.rs" -o \
-name "*.c" -o \
-name "*.cpp" -o \
-name "*.rb" \
\) | while read file; do
echo "📝 格式化: $file"
format_file "$file"
done
}
# 主逻辑
if [ $# -eq 0 ]; then
echo "用法: $0 <文件或目录>"
exit 1
fi
for target in "$@"; do
if [ -d "$target" ]; then
format_directory "$target"
elif [ -f "$target" ]; then
format_file "$target"
else
echo "❌ 路径不存在: $target"
fi
done
echo "✅ 所有文件格式化完成!"
Node.js 脚本 + 配置文件
安装配置
// package.json
{
"scripts": {
"format": "node format.js",
"format:check": "prettier --check .",
"format:fix": "npm run format"
},
"devDependencies": {
"prettier": "^3.0.0",
"eslint": "^8.0.0",
"@typescript-eslint/parser": "^6.0.0",
"@typescript-eslint/eslint-plugin": "^6.0.0"
}
}
主脚本
// format.js
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
class CodeFormatter {
constructor() {
this.extensions = {
'js': ['prettier', 'eslint'],
'ts': ['prettier', 'eslint'],
'jsx': ['prettier', 'eslint'],
'tsx': ['prettier', 'eslint'],
'json': ['prettier'],
'css': ['prettier'],
'scss': ['prettier'],
'md': ['prettier'],
'yml': ['prettier'],
'yaml': ['prettier'],
};
}
async format() {
console.log('🚀 开始格式化...');
try {
// 1. Prettier 格式化
console.log('📝 使用 Prettier...');
execSync('npx prettier --write "**/*.{js,ts,jsx,tsx,json,css,scss,md}"', {
stdio: 'inherit'
});
// 2. ESLint 修复
console.log('🔧 使用 ESLint...');
execSync('npx eslint "src/**/*.{js,ts,jsx,tsx}" --fix', {
stdio: 'inherit'
});
console.log('✅ 格式化完成!');
} catch (error) {
console.error('❌ 格式化失败:', error.message);
process.exit(1);
}
}
}
// 运行
const formatter = new CodeFormatter();
formatter.format();
Makefile 自动化
# Makefile - 代码格式化
.PHONY: format format-check setup
# 安装工具
setup:
npm install prettier eslint --save-dev
pip install black isort ruff
# 格式化所有代码
format:
@echo "🎨 格式化代码..."
@npm run format 2>/dev/null || true
@black . 2>/dev/null || true
@isort . 2>/dev/null || true
@echo "✅ 格式化完成"
# 检查格式化
format-check:
@echo "🔍 检查代码格式..."
@prettier --check "**/*.{js,ts,jsx,tsx,json,css,scss,md}" || exit 1
@eslint "src/**/*.{js,ts,jsx,tsx}" || exit 1
@black --check . || exit 1
@isort --check . || exit 1
@echo "✅ 格式检查通过"
# Git hooks 自动格式化
install-hooks:
@echo "🔗 安装 Git hooks..."
@cp scripts/pre-commit .git/hooks/
@chmod +x .git/hooks/pre-commit
@echo "✅ Git hooks 安装完成"
Git Hooks (pre-commit)
#!/bin/bash
# .git/hooks/pre-commit - Git提交前自动格式化
echo "🔍 检查代码格式..."
# 获取暂存的文件
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|tsx|jsx|py)$')
if [ -z "$STAGED_FILES" ]; then
echo "✅ 没有需要格式化的文件"
exit 0
fi
echo "📝 格式化文件:"
echo "$STAGED_FILES"
# 格式化暂存的文件
for FILE in $STAGED_FILES; do
case "$FILE" in
*.py)
black "$FILE"
isort "$FILE"
git add "$FILE"
;;
*.js|*.ts|*.tsx|*.jsx)
npx prettier --write "$FILE"
npx eslint --fix "$FILE" 2>/dev/null || true
git add "$FILE"
;;
esac
done
echo "✅ 格式化完成"
使用示例
# 1. 格式化单个文件 ./format.sh src/index.js # 2. 格式化整个项目 ./format_all.sh ./src # 3. 使用 Makefile make format make format-check # 4. 使用 Node.js 脚本 node format.js # 5. 安装 Git hooks make install-hooks
配置文件示例
Prettier 配置 (.prettierrc)
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 100,
"tabWidth": 4,
"endOfLine": "lf"
}
ESLint 配置 (.eslintrc.js)
module.exports = {
extends: ['eslint:recommended'],
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module'
},
rules: {
'indent': ['error', 4],
'quotes': ['error', 'single'],
'semi': ['error', 'always']
}
};
这套方案可以根据你的项目需求灵活选择或组合使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播