From e3a6d4b18ab909bf6746e6dc76f87b69da7f3949 Mon Sep 17 00:00:00 2001 From: Innei Date: Thu, 26 May 2022 10:41:05 +0800 Subject: [PATCH] fix: install pkg when restore data --- src/modules/backup/backup.service.ts | 25 ++++++++++++++++++++++--- src/utils/system.util.ts | 8 +++++++- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/modules/backup/backup.service.ts b/src/modules/backup/backup.service.ts index 82faa39e..4bfffadc 100644 --- a/src/modules/backup/backup.service.ts +++ b/src/modules/backup/backup.service.ts @@ -18,7 +18,7 @@ import { BACKUP_DIR, DATA_DIR } from '~/constants/path.constant' import { CacheService } from '~/processors/cache/cache.service' import { EventManagerService } from '~/processors/helper/helper.event.service' import { getMediumDateTime } from '~/utils' -import { getFolderSize } from '~/utils/system.util' +import { getFolderSize, installPKG } from '~/utils/system.util' import { ConfigsService } from '../configs/configs.service' @@ -188,7 +188,9 @@ export class BackupService { } // 还原 backup_data - const backupDataDirFilenames = await readdir(join(dirPath, 'backup_data')) + const backupDataDir = join(dirPath, 'backup_data') + + const backupDataDirFilenames = await readdir(backupDataDir) await Promise.all( backupDataDirFilenames.map(async (filename) => { @@ -201,11 +203,28 @@ export class BackupService { }), ) + try { + const packageJson = await readFile(join(backupDataDir, 'package.json'), { + encoding: 'utf-8', + }) + const pkg = JSON.parse(packageJson) + if (pkg.dependencies) { + await Promise.all( + Object.entries(pkg.dependencies).map(([name, version]) => { + this.logger.log(`--> 安装依赖 ${name}@${version}`) + return installPKG(`${name}@${version}`, DATA_DIR).catch((er) => { + this.logger.error(`--> 依赖安装失败:${er.message}`) + }) + }), + ) + } + } catch (er) {} + await Promise.all([ this.cacheService.cleanAllRedisKey(), this.cacheService.cleanCatch(), ]) - await rm(join(dirPath, 'backup_data'), { force: true, recursive: true }) + await rm(backupDataDir, { force: true, recursive: true }) } async rollbackTo(dirname: string) { diff --git a/src/utils/system.util.ts b/src/utils/system.util.ts index 1f87ab89..62ff7a53 100644 --- a/src/utils/system.util.ts +++ b/src/utils/system.util.ts @@ -77,7 +77,13 @@ export const installPKG = async (name: string, cwd: string) => { } } if (!manager) { - throw new Error('No package manager found') + // fallback to npm + const npmVersion = await nothrow($`npm -v`) + if (npmVersion.exitCode === 0) { + manager = 'npm' + } else { + throw new Error('No package manager found') + } } cd(cwd) await $`${manager} ${INSTALL_COMMANDS[manager]} ${name}`