如何在package.json变更时自动运行yarn audit再执行npm脚本
实现方案
有可落地的技术方案,核心通过npm生命周期钩子+package.json文件哈希校验实现,以下是两种常用实现方式:
方案1:原生npm钩子实现(无额外全局依赖)
通过npm内置的pre脚本钩子逻辑,搭配自定义校验脚本实现,适合大部分中小型项目:
- 步骤1:在项目根目录新建校验脚本
.audit-check.js,代码如下:
const fs = require('fs') const crypto = require('crypto') const { execSync } = require('child_process') // 可自定义配置 const CONFIG = { packagePath: './package.json', hashRecordPath: './.package-hash', skipEnvKey: 'SKIP_AUDIT' } // 支持手动跳过校验 if (process.env[CONFIG.skipEnvKey]) process.exit(0) // 计算当前package.json哈希值 const currentContent = fs.readFileSync(CONFIG.packagePath) const currentHash = crypto.createHash('md5').update(currentContent).digest('hex') // 读取上一次记录的哈希值 let lastHash = '' if (fs.existsSync(CONFIG.hashRecordPath)) { lastHash = fs.readFileSync(CONFIG.hashRecordPath, 'utf8').trim() } // 哈希不一致时执行yarn audit if (currentHash !== lastHash) { console.log('检测到package.json已变更,自动执行yarn audit校验依赖风险...') try { execSync('yarn audit', { stdio: 'inherit' }) // 校验通过更新哈希记录 fs.writeFileSync(CONFIG.hashRecordPath, currentHash) } catch (err) { console.error('yarn audit 检测到存在高危依赖风险,请修复后再执行脚本') process.exit(1) } }
- 步骤2:在package.json的
scripts字段中,为需要触发校验的脚本添加对应前置钩子,统一指向校验脚本:
{ "scripts": { "prestart": "node .audit-check.js", "prebuild": "node .audit-check.js", "pretest": "node .audit-check.js", "preinstall": "node .audit-check.js", // 其余业务脚本保持不变 "start": "vite", "build": "vite build", "test": "vitest run" } }
- 步骤3:将哈希记录文件
.package-hash添加到.gitignore,避免提交到远程仓库。
方案2:自动覆盖所有脚本(适合脚本较多的大型项目)
如果项目自定义脚本数量多,逐个添加pre钩子效率低,可以通过轻量工具实现全脚本自动触发:
- 步骤1:安装开发依赖:
npm install script-guard --save-dev - 步骤2:在package.json中添加全局脚本执行规则,无需修改原有脚本配置:
{ "script-guard": { "beforeAll": "node .audit-check.js" } }
配置完成后,所有npm、yarn脚本执行前都会自动触发校验逻辑。
可选优化配置
如需调整拦截规则,可以修改
.audit-check.js的参数:
- 不需要强制拦截audit不通过的场景,删除
process.exit(1)逻辑即可,仅输出检测结果不阻断脚本运行- 可以自定义
yarn audit的参数,比如仅检测高危风险改为yarn audit --level high
内容的提问来源于stack exchange,提问作者yasiru
相关产品推荐
相关产品推荐

