本文目录导读:

我来为您提供一个代码规范检查脚本,可以根据需要选择不同语言的版本。
Python代码规范检查脚本
#!/usr/bin/env python3
"""
代码规范检查脚本
支持Python、JavaScript、Java等语言的规范检查
"""
import os
import sys
import subprocess
import argparse
from pathlib import Path
class CodeLinter:
"""代码规范检查器"""
def __init__(self, path, fix=False, verbose=False):
self.path = path
self.fix = fix
self.verbose = verbose
self.exit_code = 0
def check_python(self, files):
"""检查Python代码规范"""
print("\n🔍 检查Python代码规范...")
# 安装必要的工具
tools = ['flake8', 'pylint', 'black', 'isort']
for tool in tools:
try:
__import__(tool.replace('-', '_'))
except ImportError:
subprocess.run([sys.executable, '-m', 'pip', 'install', tool],
capture_output=True)
results = []
# 1. Flake8 检查
if self.fix:
print(" ⚡ 运行 Black 格式化...")
subprocess.run(['python', '-m', 'black', self.path])
print(" ⚡ 运行 isort 排序导入...")
subprocess.run(['python', '-m', 'isort', self.path])
# 2. Flake8 检查
print(" 📋 运行 flake8 检查...")
result = subprocess.run(
['python', '-m', 'flake8', '--max-line-length=120', self.path],
capture_output=True, text=True
)
if result.stdout:
results.append(("Flake8", result.stdout))
self.exit_code = 1
# 3. Pylint 检查
if self.verbose:
print(" 📋 运行 pylint 检查...")
result = subprocess.run(
['python', '-m', 'pylint', '--max-line-length=120', self.path],
capture_output=True, text=True
)
if result.stdout:
results.append(("Pylint", result.stdout[:500]))
return results
def check_javascript(self, files):
"""检查JavaScript代码规范"""
print("\n🔍 检查JavaScript代码规范...")
results = []
# 检查是否有ESLint
try:
subprocess.run(['eslint', '--version'], capture_output=True)
except FileNotFoundError:
print(" ⚠️ ESLint未安装,请执行: npm install -g eslint")
return results
print(" 📋 运行 ESLint 检查...")
result = subprocess.run(
['eslint', self.path, '--ext', '.js,.jsx,.ts,.tsx'],
capture_output=True, text=True
)
if result.stdout:
results.append(("ESLint", result.stdout))
self.exit_code = 1
return results
def check_cpp(self, files):
"""检查C/C++代码规范"""
print("\n🔍 检查C/C++代码规范...")
results = []
# 检查是否有cpplint
try:
subprocess.run(['cpplint', '--version'], capture_output=True)
except FileNotFoundError:
print(" ⚠️ cpplint未安装,请执行: pip install cpplint")
return results
print(" 📋 运行 cpplint 检查...")
result = subprocess.run(
['cpplint', '--linelength=100'] + files,
capture_output=True, text=True
)
if result.stdout:
results.append(("CPPLint", result.stdout))
self.exit_code = 1
return results
def run_all_checks(self):
"""运行所有检查"""
print(f"\n{'='*50}")
print(f"📁 检查路径: {self.path}")
print(f"{'='*50}")
# 收集所有文件
path = Path(self.path)
all_files = []
if path.is_file():
all_files.extend([str(path)])
else:
for ext in ['*.py', '*.js', '*.jsx', '*.ts', '*.tsx', '*.cpp', '*.h', '*.hpp']:
all_files.extend([str(f) for f in path.rglob(ext)])
if not all_files:
print("❌ 未找到需要检查的文件")
return self.exit_code
# 按类型分组
py_files = [f for f in all_files if f.endswith('.py')]
js_files = [f for f in all_files if f.endswith(('.js', '.jsx', '.ts', '.tsx'))]
cpp_files = [f for f in all_files if f.endswith(('.cpp', '.h', '.hpp'))]
print(f"\n📊 文件统计:")
print(f" Python文件: {len(py_files)}个")
print(f" JavaScript文件: {len(js_files)}个")
print(f" C/C++文件: {len(cpp_files)}个")
# 执行检查
all_results = []
if py_files:
all_results.extend(self.check_python(py_files))
if js_files:
all_results.extend(self.check_javascript(js_files))
if cpp_files:
all_results.extend(self.check_cpp(cpp_files))
# 输出结果
if all_results:
print(f"\n{'='*50}")
print("❌ 发现以下问题:")
print(f"{'='*50}")
for tool, output in all_results:
print(f"\n🔴 {tool} 报告:")
print(output)
else:
print(f"\n✅ 代码规范检查通过!")
return self.exit_code
def check_git_hooks():
"""检查Git hooks配置"""
print("\n📋 检查Git hooks...")
git_dir = Path('.git')
if not git_dir.exists():
print(" ⚠️ 不是Git仓库")
return
hooks_dir = git_dir / 'hooks'
pre_commit = hooks_dir / 'pre-commit'
if pre_commit.exists():
print(" ✅ pre-commit hook 已安装")
else:
print(" ❌ pre-commit hook 未安装")
def main():
parser = argparse.ArgumentParser(description='代码规范检查工具')
parser.add_argument('path', nargs='?', default='.',
help='要检查的文件或目录路径 (默认: 当前目录)')
parser.add_argument('--fix', action='store_true',
help='自动修复可修复的问题')
parser.add_argument('--verbose', '-v', action='store_true',
help='显示详细信息')
parser.add_argument('--git-hooks', action='store_true',
help='检查Git hooks配置')
args = parser.parse_args()
if args.git_hooks:
check_git_hooks()
return
linter = CodeLinter(args.path, args.fix, args.verbose)
exit_code = linter.run_all_checks()
sys.exit(exit_code)
if __name__ == '__main__':
main()
Bash版本(更简单)
#!/bin/bash
# 代码规范检查脚本
# 使用方法: ./lint.sh [目录路径]
set -e
TARGET_DIR="${1:-.}"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${YELLOW}========================================${NC}"
echo -e "${YELLOW} 代码规范检查工具${NC}"
echo -e "${YELLOW}========================================${NC}"
echo -e "检查目录: ${TARGET_DIR}"
# 检查Python代码
check_python() {
echo -e "\n${YELLOW}检查Python代码...${NC}"
# 安装依赖
pip install flake8 black isort -q 2>/dev/null
# 运行flake8
echo -e "${GREEN}运行 flake8...${NC}"
flake8 "$TARGET_DIR" --max-line-length=120
# 运行black检查
echo -e "${GREEN}检查代码格式 (black)...${NC}"
black --check "$TARGET_DIR" 2>/dev/null || {
echo -e "${YELLOW}建议运行: black $TARGET_DIR${NC}"
}
echo -e "${GREEN}✓ Python检查完成${NC}"
}
# 检查JavaScript代码
check_javascript() {
echo -e "\n${YELLOW}检查JavaScript代码...${NC}"
# 检查是否有ESLint
if command -v eslint &> /dev/null; then
echo -e "${GREEN}运行 ESLint...${NC}"
eslint "$TARGET_DIR" --ext .js,.jsx,.ts,.tsx
else
echo -e "${RED}ESLint 未安装,跳过JavaScript检查${NC}"
echo -e "${YELLOW}安装: npm install -g eslint${NC}"
fi
echo -e "${GREEN}✓ JavaScript检查完成${NC}"
}
# 检查C/C++代码
check_cpp() {
echo -e "\n${YELLOW}检查C/C++代码...${NC}"
# 使用cppcheck
if command -v cppcheck &> /dev/null; then
echo -e "${GREEN}运行 cppcheck...${NC}"
cppcheck --enable=all --suppress=missingIncludeSystem "$TARGET_DIR"
else
echo -e "${RED}cppcheck 未安装,跳过C/C++检查${NC}"
echo -e "${YELLOW}安装: brew install cppcheck 或 apt install cppcheck${NC}"
fi
}
# 检查提交信息规范
check_commit_message() {
echo -e "\n${YELLOW}检查提交信息规范...${NC}"
# 使用commitlint
if command -v commitlint &> /dev/null; then
echo -e "${GREEN}运行 commitlint...${NC}"
# 检查最近一次提交信息
commitlint --from HEAD~1 --to HEAD 2>/dev/null || true
fi
echo -e "${GREEN}✓ 提交信息检查完成${NC}"
}
# 检查文件命名规范
check_file_naming() {
local issues=0
echo -e "\n${YELLOW}检查文件命名规范...${NC}"
# 检查不规范的命名
while IFS= read -r file; do
# 检查空格
if [[ "$file" =~ " " ]]; then
echo -e "${RED}⚠ 文件名包含空格: $file${NC}"
((issues++))
fi
# 检查大写字母(除了特定文件)
if [[ "$file" =~ [A-Z] && ! "$file" =~ ^\.git && ! "$file" =~ Dockerfile ]]; then
# 允许特定的大写文件名
case "$file" in
*Makefile*|*Dockerfile*|*README*|*LICENSE*|*CHANGELOG*)
;;
*)
echo -e "${YELLOW}⚠ 文件名包含大写字母: $file${NC}"
((issues++))
;;
esac
fi
done < <(find "$TARGET_DIR" -type f -not -path '*/\.*' 2>/dev/null)
if [ $issues -eq 0 ]; then
echo -e "${GREEN}✓ 文件命名规范${NC}"
else
echo -e "${YELLOW}发现 $issues 个文件命名问题${NC}"
fi
}
# 主函数
main() {
# 检查目录是否存在
if [ ! -d "$TARGET_DIR" ] && [ ! -f "$TARGET_DIR" ]; then
echo -e "${RED}错误: 路径不存在: $TARGET_DIR${NC}"
exit 1
fi
# 检查是否有代码文件
local file_count=$(find "$TARGET_DIR" -type f \( -name "*.py" -o -name "*.js" -o -name "*.cpp" \) 2>/dev/null | wc -l)
if [ "$file_count" -eq 0 ]; then
echo -e "${RED}未找到需要检查的代码文件${NC}"
exit 0
fi
echo -e "发现 ${file_count} 个代码文件\n"
# 执行检查
check_file_naming
check_python
check_javascript
check_cpp
check_commit_message
echo -e "\n${GREEN}========================================${NC}"
echo -e "${GREEN} 代码规范检查完成!${NC}"
echo -e "${GREEN}========================================${NC}"
}
# 运行主函数
main
使用示例
# Python脚本使用 python lint.py # 检查当前目录 python lint.py /path/to/project # 检查指定目录 python lint.py --fix # 自动修复问题 python lint.py --verbose # 显示详细信息 # Bash脚本使用 chmod +x lint.sh # 添加执行权限 ./lint.sh # 检查当前目录 ./lint.sh src/ # 检查src目录
配置文件
创建 .flake8 配置文件:
[flake8] max-line-length = 120 exclude = .git,__pycache__,venv,node_modules,migrations ignore = E203, W503
创建 .pylintrc 配置文件:
[MASTER] ignore = .git,__pycache__,venv,node_modules max-line-length=120 [MESSAGES CONTROL] disable = C0111, C0103, W0612
这个脚本支持多种语言的代码规范检查,可以根据需要启用或禁用特定语言的检查。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播