Files
height_manager/client/scripts/install-missing-deps.js
jaystar 28c4d7b3b4 feat: 实现减脂体重管理App完整功能
- 实现拍照识别食物功能(集成大语言模型视觉能力)
- 实现智能对话功能(集成大语言模型流式输出)
- 实现食物记录和卡路里管理功能
- 实现体重记录和统计功能
- 实现健康数据管理页面
- 配置数据库表结构(用户、食物记录、体重记录)
- 实现Express后端API路由
- 配置Tab导航和前端页面
- 采用健康运动配色方案
2026-02-02 15:17:50 +08:00

106 lines
3.0 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
/**
* 自动检测并安装缺失的依赖
* 使用方法: node scripts/install-missing-deps.js
*/
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
console.log('🔍 检测缺失的依赖...\n');
try {
// 运行 depcheck 并获取 JSON 输出
// 注意depcheck 发现问题时会返回非零退出码,但这不是错误
let depcheckOutput;
try {
depcheckOutput = execSync('npx depcheck --json', {
encoding: 'utf-8',
stdio: ['pipe', 'pipe', 'pipe'],
});
} catch (execError) {
// depcheck 返回非零退出码时仍然有输出
if (execError.stdout) {
depcheckOutput = execError.stdout;
} else {
throw execError;
}
}
const result = JSON.parse(depcheckOutput);
// 获取缺失的依赖
const missing = result.missing || {};
// 需要忽略的文件模式
const ignoreFilePatterns = [
/template\.config\.(ts|js)$/, // 模板配置文件
/\.template\./, // 其他模板文件
/declarations\.d\.ts$/, // 项目配置文件
];
// 过滤包:排除内部别名和只被模板文件引用的包
const missingPackages = Object.keys(missing).filter(pkg => {
// 排除内部路径别名
if (pkg.startsWith('@api/') || pkg.startsWith('@/') || pkg === '@api') {
return false;
}
// 获取引用该包的文件列表
const referencingFiles = missing[pkg] || [];
// 过滤掉模板配置文件
const nonTemplateFiles = referencingFiles.filter(file => {
return !ignoreFilePatterns.some(pattern => pattern.test(file));
});
// 只有当存在非模板文件引用时才保留该包
return nonTemplateFiles.length > 0;
});
if (missingPackages.length === 0) {
console.log('✅ 没有发现缺失的依赖!');
process.exit(0);
}
console.log('📦 发现以下缺失的依赖:');
missingPackages.forEach((pkg, index) => {
const files = missing[pkg];
console.log(` ${index + 1}. ${pkg}`);
console.log(
` 被引用于: ${files.slice(0, 2).join(', ')}${files.length > 2 ? ' ...' : ''}`,
);
});
console.log('\n🚀 开始安装...\n');
// 使用 expo install 安装所有缺失的包
const packagesToInstall = missingPackages.join(' ');
try {
execSync(`pnpm expo install ${packagesToInstall}`, {
stdio: 'inherit',
});
console.log('\n✅ 所有缺失的依赖已安装完成!');
} catch (installError) {
console.log('\n⚠ expo install 失败,尝试使用 npm install...\n');
execSync(`npm install ${packagesToInstall}`, {
stdio: 'inherit',
});
console.log('\n✅ 所有缺失的依赖已通过 npm 安装完成!');
}
} catch (error) {
if (error.message.includes('depcheck')) {
console.error('❌ depcheck 未安装或运行失败');
console.log('💡 尝试运行: npm install -g depcheck');
} else {
console.error('❌ 发生错误:', error.message);
}
process.exit(1);
}