force-delete-dist.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/env node
  2. /**
  3. * 强制删除项目下的 dist 目录(含长路径/占用时多轮重试)
  4. */
  5. const fs = require('fs')
  6. const path = require('path')
  7. const { execSync } = require('child_process')
  8. const projectRoot = path.resolve(__dirname, '..')
  9. const distPath = path.join(projectRoot, 'dist')
  10. const maxRetries = 5
  11. const retryDelayMs = 1500
  12. function sleep(ms) {
  13. return new Promise((r) => setTimeout(r, ms))
  14. }
  15. function deleteWithNode() {
  16. try {
  17. fs.rmSync(distPath, { recursive: true, force: true, maxRetries: 3 })
  18. return true
  19. } catch (e) {
  20. return false
  21. }
  22. }
  23. function deleteWithLongPath() {
  24. if (process.platform !== 'win32') return false
  25. try {
  26. const longPath = '\\\\?\\' + path.resolve(projectRoot, 'dist').replace(/\//g, '\\')
  27. fs.rmSync(longPath, { recursive: true, force: true, maxRetries: 3 })
  28. return true
  29. } catch (e) {
  30. return false
  31. }
  32. }
  33. function deleteWithCmd() {
  34. try {
  35. execSync('rmdir /s /q dist', { cwd: projectRoot, stdio: 'pipe', windowsHide: true })
  36. return true
  37. } catch (e) {
  38. return false
  39. }
  40. }
  41. async function main() {
  42. if (!fs.existsSync(distPath)) {
  43. console.log('dist 不存在,无需删除。')
  44. process.exit(0)
  45. }
  46. console.log('正在强制删除 dist...')
  47. for (let i = 0; i < maxRetries; i++) {
  48. if (deleteWithNode()) {
  49. console.log('已删除 dist(Node)。')
  50. process.exit(0)
  51. }
  52. if (process.platform === 'win32' && deleteWithLongPath()) {
  53. console.log('已删除 dist(长路径)。')
  54. process.exit(0)
  55. }
  56. if (deleteWithCmd()) {
  57. console.log('已删除 dist(cmd rmdir)。')
  58. process.exit(0)
  59. }
  60. if (i < maxRetries - 1) {
  61. console.log(`第 ${i + 1} 次未完全删除,${retryDelayMs / 1000} 秒后重试...`)
  62. await sleep(retryDelayMs)
  63. }
  64. }
  65. console.error('无法删除 dist,请关闭占用该目录的程序(如 Explorer、本应用)后重试,或手动删除。')
  66. process.exit(1)
  67. }
  68. main()