本文目录导读:

我来介绍几种批量检查包冲突的脚本方法,针对不同的包管理器:
npm 包冲突检查
基础冲突检测脚本
#!/bin/bash # check-npm-conflicts.sh echo "检查 npm 包冲突..." npm ls 2>&1 | grep -E "UNMET DEPENDENCY|CONFLICT|ERESOLVE" || echo "未发现冲突"
深度冲突分析脚本
#!/bin/bash
# deep-check-conflicts.sh
PROJECT_DIR=$1
if [ -z "$PROJECT_DIR" ]; then
echo "用法: ./deep-check-conflicts.sh <项目目录>"
exit 1
fi
cd "$PROJECT_DIR"
echo "=== 1. 检查基础依赖 ==="
npm list --depth=0 2>&1
echo -e "\n=== 2. 检查深度依赖冲突 ==="
npm ls 2>&1 | grep -E "UNMET|CONFLICT|ERESOLVE|while resolving|peer dependencies"
echo -e "\n=== 3. 检查版本不兼容 ==="
npm outdated 2>&1
echo -e "\n=== 4. 生成依赖树报告 ==="
npm list --all > dependency-tree.txt 2>&1
echo "依赖树已保存到 dependency-tree.txt"
批量检查多个项目
批量扫描脚本
#!/bin/bash
# batch-check-projects.sh
# 要扫描的项目目录列表
PROJECTS=(
"/path/to/project1"
"/path/to/project2"
"/path/to/project3"
)
for project in "${PROJECTS[@]}"; do
echo "========== 检查项目: $project =========="
if [ -f "$project/package.json" ]; then
cd "$project"
# 安装依赖(如果需要)
# npm install --dry-run 2>&1 | grep -E "CONFLICT|ERESOLVE"
# 检查已安装的依赖冲突
result=$(npm ls 2>&1 | grep -E "UNMET|CONFLICT|ERESOLVE")
if [ -n "$result" ]; then
echo "⚠️ 发现冲突:"
echo "$result"
else
echo "✅ 未发现冲突"
fi
else
echo "❌ 未找到 package.json"
fi
echo ""
done
使用 npm-check 工具
安装并使用
#!/bin/bash # install-and-check.sh # 安装全局工具 npm install -g npm-check echo "检查依赖更新和冲突..." npm-check --skip-unused 2>&1 | grep -E "update|conflict|warning|error"
高级冲突检测脚本
#!/usr/bin/env node
// advanced-conflict-checker.js
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
class DependencyConflictChecker {
constructor(projectPath) {
this.projectPath = projectPath;
this.conflicts = [];
}
checkPackageJson() {
const packagePath = path.join(this.projectPath, 'package.json');
if (!fs.existsSync(packagePath)) {
console.error('❌ 未找到 package.json');
return false;
}
return true;
}
checkDirectConflicts() {
console.log('检查直接依赖冲突...');
try {
const result = execSync('npm ls --depth=0', {
cwd: this.projectPath,
encoding: 'utf8'
});
console.log(result);
} catch (error) {
this.conflicts.push({
type: 'direct',
message: error.message
});
}
}
checkTransitiveConflicts() {
console.log('检查传递依赖冲突...');
try {
const result = execSync('npm ls 2>&1 | grep -E "UNMET|CONFLICT|ERESOLVE"', {
cwd: this.projectPath,
shell: true,
encoding: 'utf8'
});
if (result.trim()) {
this.conflicts.push({
type: 'transitive',
message: result
});
}
} catch (error) {
// grep 可能返回非零退出码
}
}
checkPeerDependencies() {
console.log('检查对等依赖...');
const packageJson = JSON.parse(
fs.readFileSync(path.join(this.projectPath, 'package.json'), 'utf8')
);
const deps = {...packageJson.dependencies, ...packageJson.devDependencies};
const peerDeps = packageJson.peerDependencies || {};
for (const [pkg, version] of Object.entries(peerDeps)) {
if (deps[pkg] && deps[pkg] !== version) {
this.conflicts.push({
type: 'peer',
package: pkg,
expected: version,
found: deps[pkg]
});
}
}
}
generateConflictReport() {
console.log('\n=== 冲突报告 ===');
if (this.conflicts.length === 0) {
console.log('✅ 未发现任何冲突');
return;
}
this.conflicts.forEach((conflict, index) => {
console.log(`\n冲突 ${index + 1}:`);
console.log(`类型: ${conflict.type}`);
console.log(`详情:`, conflict.message || conflict);
});
console.log(`\n共发现 ${this.conflicts.length} 个冲突`);
}
run() {
console.log(`开始检查项目: ${this.projectPath}`);
if (!this.checkPackageJson()) return;
this.checkDirectConflicts();
this.checkTransitiveConflicts();
this.checkPeerDependencies();
this.generateConflictReport();
}
}
// 使用示例
const checker = new DependencyConflictChecker('/path/to/your/project');
checker.run();
持续集成中的冲突检查
# .github/workflows/conflict-check.yml
name: Dependency Conflict Check
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
check-conflicts:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: |
npm ci --ignore-scripts 2>&1 | head -50
continue-on-error: true
- name: Check for conflicts
run: |
npm ls 2>&1 | grep -E "UNMET|CONFLICT|ERESOLVE" || echo "No conflicts found"
- name: Generate conflict report
if: failure()
run: |
npm ls --all > conflict-report.txt
echo "冲突报告已保存"
- name: Upload report
if: failure()
uses: actions/upload-artifact@v3
with:
name: conflict-report
path: conflict-report.txt
多包管理器支持
#!/bin/bash
# universal-check.sh
check_npm() {
cd "$1"
echo "检查 npm 依赖..."
npm ls 2>&1 | grep -E "UNMET|CONFLICT|ERESOLVE"
}
check_yarn() {
cd "$1"
echo "检查 yarn 依赖..."
yarn check --integrity 2>&1 || true
yarn list --depth=0 2>&1 | grep -E "warning|conflict"
}
check_pnpm() {
cd "$1"
echo "检查 pnpm 依赖..."
pnpm list --depth=0 2>&1 | grep -E "missing|conflict"
}
# 根据 lock 文件选择检查方式
PROJECT_DIR="${1:-.}"
if [ -f "$PROJECT_DIR/yarn.lock" ]; then
check_yarn "$PROJECT_DIR"
elif [ -f "$PROJECT_DIR/pnpm-lock.yaml" ]; then
check_pnpm "$PROJECT_DIR"
elif [ -f "$PROJECT_DIR/package-lock.json" ]; then
check_npm "$PROJECT_DIR"
else
echo "未知的包管理器"
exit 1
fi
使用说明
-
直接运行脚本:
chmod +x check-npm-conflicts.sh ./check-npm-conflicts.sh
-
批量扫描:
./batch-check-projects.sh
-
Node.js 版本:
node advanced-conflict-checker.js
这些脚本可以帮助你快速发现和定位包冲突问题,建议在 CI/CD 流程中集成使用。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播