如何在每次Meteor服务器重启时运行npm脚本?
嘿,我完全懂你的困扰——postinstall钩子确实只在首次安装依赖时触发,重启应用或者后续构建流程根本不会理它,而且你不想把一堆配置从package.json挪去build plugins里,这点太能理解了。这儿有几个实用的方案,都能让你把配置留在package.json里,同时实现“每次重启/构建都触发指定逻辑”的需求:
方案1:用prestart/poststart钩子替代
npm的脚本钩子不止install系列,还有和start命令绑定的prestart(启动前触发)和poststart(启动后触发)钩子。你可以把原本想在postinstall里执行的、需要每次启动都跑的逻辑,移到prestart脚本里。比如:
{ "scripts": { "prestart": "node ./scripts/your-custom-setup.js", "start": "node index.js" } }
这样不管是首次启动还是重启应用,只要你运行npm start(包括重启时触发的启动流程),都会先执行prestart里的脚本。所有配置都老老实实待在package.json里,完全不用碰build plugins。
方案2:标记文件+启动时校验
如果你的重启流程会涉及到依赖目录的清理或者重置,可以用“标记文件”的思路:
- 在
postinstall里创建一个标记文件(比如.setup-completed),用来标记首次初始化完成; - 在启动脚本的开头加入校验逻辑,如果标记文件不存在,就执行你需要的初始化脚本,同时重新创建标记文件。
示例配置:
{ "scripts": { "postinstall": "touch .setup-completed", "start": "node ./scripts/check-setup.js && node index.js" } }
check-setup.js里的核心逻辑大概是这样:
const fs = require('fs'); const path = require('path'); const markerPath = path.join(__dirname, '../.setup-completed'); if (!fs.existsSync(markerPath)) { // 执行你原本想在postinstall里跑的初始化逻辑 console.log('Running setup...'); // 比如:require('./your-setup-script.js'); // 最后创建标记文件 fs.writeFileSync(markerPath, ''); }
这样不管是首次安装后的启动,还是重启后触发的构建,只要标记文件不存在(比如被清理了),就会自动执行初始化逻辑。
备选方案:针对构建工具的前置脚本(如果适用)
如果你的重启是来自构建工具(比如webpack-dev-server、Vite的热重启),可以直接在构建命令前添加前置脚本,不用额外引入插件:
{ "scripts": { "build": "node ./scripts/setup.js && webpack", "dev": "node ./scripts/setup.js && webpack serve" } }
这样每次构建(包括重启后的重新构建)都会先跑你的初始化脚本,配置依然留在package.json里。
内容的提问来源于stack exchange,提问作者Jankapunkt




