如何在运行所有NPM script之前自动执行指定前置脚本
可行的优雅实现方案
方案1:使用npm原生全局前置钩子(最推荐)
npm原生提供了全脚本生命周期钩子prerun,会在任何npm run触发的脚本执行前自动运行,不需要手动修改每个业务脚本,也不需要自定义封装shell命令,团队成员不需要改变任何原有npm run <脚本名>的使用习惯,无额外学习成本。
配置方式如下:
{ "scripts": { "prerun": "./setup_environment.sh", "script_one": "do something", "script_two": "do somethingelse" } }
如果需要跳过部分不需要执行前置校验的脚本,可以在setup_environment.sh中利用npm自动注入的npm_lifecycle_event环境变量(存储当前触发的目标脚本名)做判断:
#!/bin/bash # 配置不需要执行前置校验的脚本名单 SKIP_SCRIPTS=("setup_environment" "lint" "test") if [[ " ${SKIP_SCRIPTS[@]} " =~ " ${npm_lifecycle_event} " ]]; then exit 0 fi # 后续环境校验逻辑
该方案兼容npm v6+、pnpm、Yarn v1版本,高版本Yarn可通过开启npmScriptsEnabled配置支持该特性。
方案2:使用轻量脚本管理工具辅助
如果需要兼容更多包管理器版本,可以使用npm-run-all工具简化配置,不需要每个脚本手动拼接前置逻辑:
- 先安装依赖:
npm i npm-run-all -D - package.json配置如下:
{ "scripts": { "setup": "./setup_environment.sh", "script_one": "do something", "script_two": "do somethingelse", "run": "run-s setup $npm_config_script" } }
使用时执行npm run run --script=script_one即可自动先跑前置脚本再执行目标脚本。
内容的提问来源于stack exchange,提问作者twiz
相关产品推荐
相关产品推荐

