smart-install.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. const fs = require('fs');
  2. const path = require('path');
  3. const { execSync } = require('child_process');
  4. const NODE_MODULES_DIR = 'node_modules';
  5. const PACKAGE_LOCK = 'package-lock.json';
  6. const CACHE_LOCK = path.join(NODE_MODULES_DIR, '.package-lock.json');
  7. function fileExists(filepath) {
  8. try {
  9. return fs.existsSync(filepath);
  10. } catch (err) {
  11. return false;
  12. }
  13. }
  14. function filesAreEqual(file1, file2) {
  15. try {
  16. const content1 = fs.readFileSync(file1, 'utf8');
  17. const content2 = fs.readFileSync(file2, 'utf8');
  18. return content1 === content2;
  19. } catch (err) {
  20. return false;
  21. }
  22. }
  23. function runNpmInstall() {
  24. console.log('📦 开始安装依赖...');
  25. try {
  26. // 使用 stdio: 'inherit' 让输出直接显示在控制台
  27. execSync('npm install --force', {
  28. stdio: 'inherit',
  29. encoding: 'utf8'
  30. });
  31. // 安装完成后,保存 package-lock.json 的副本
  32. fs.copyFileSync(PACKAGE_LOCK, CACHE_LOCK);
  33. console.log('✅ 依赖安装完成');
  34. return true;
  35. } catch (error) {
  36. console.error('❌ 安装失败:', error.message);
  37. process.exit(1);
  38. }
  39. }
  40. function main() {
  41. console.log('🔍 检查依赖安装状态...');
  42. console.log(` 平台: ${process.platform} | 架构: ${process.arch} | Node: ${process.version}`);
  43. let needsInstall = false;
  44. // 检查 node_modules 是否存在
  45. if (!fileExists(NODE_MODULES_DIR)) {
  46. console.log('⚠️ node_modules 不存在,需要安装');
  47. needsInstall = true;
  48. }
  49. // 检查缓存的 package-lock.json 是否存在
  50. else if (!fileExists(CACHE_LOCK)) {
  51. console.log('⚠️ 缓存标记不存在,需要安装');
  52. needsInstall = true;
  53. }
  54. // 检查 package-lock.json 是否变化
  55. else if (!filesAreEqual(PACKAGE_LOCK, CACHE_LOCK)) {
  56. console.log('⚠️ package-lock.json 已变化,需要重新安装');
  57. needsInstall = true;
  58. }
  59. else {
  60. console.log('✅ 依赖未变化,跳过安装(节省时间)');
  61. }
  62. if (needsInstall) {
  63. runNpmInstall();
  64. }
  65. }
  66. main();