package.json
文件的“scripts”
属性支持许多内置脚本,及其预设的生命周期事件。特别是,当运行npm run <stage>
这些命令时,也将运行其前置和后置命令…
一、npm scripts
生命周期
1.install
npm install命令,更多参考 官网
当你运行
npm install -g <pkg name>
时,以下命令也会运行
preinstall
install
postinstall
prepublish
preprepare
prepare
postprepare
更多介绍,请参考 npm sscripts / life-cycle-operation-order
二、npm scripts
常见问题
1. 如何封装【npm package
在安装时自动执行】的脚本?
场景:在业务项目
project_a
安装npm package A
时,自动执行npm package A
内置的脚本,触发某些操作
方案:
在package A
的生命周期中定义脚本test
,脚本test
会在安装package A
时自动执行
以上方案衍生出两个新的问题:
- 触发时机:如何严格要求,是项目
project_a
的postinstall
时机,才去执行某些逻辑。package A
自身安装的时候,自身不会触发内部定义的postinstall
逻辑 —— 通过【环境变量】可解 - 多包的安装执行时机:monorepo架构下,如何控制多包的安装执行时机?是否可以单独patch-package某个包?—— 【无解】,官方不支持单独patch某个包
以下是封装【package A
在安装时自动执行脚本】的具体示例:
1.在
A
包中,定义在【X生命周期】执行的脚本: 例如,在A
包的package.json
中定义postinstall
脚本postinstall.js
,脚本postinstall.js
将在A
包安装后运行A
包的package.json
:{ "name": "A", "version": "1.0.0", "scripts": { "postinstall": "IS_PACKAGE_A=true node ./scripts/postinstall.js" }, "main": "index.js" }
2.编写
postinstall.js
脚本: 在A
包中创建scripts/postinstall.js
脚本文件使用环境变量或命令行参数,来判断是否要执行特定的逻辑。例如,
scripts/postinstall.js
中,通过检查环境变量IS_PACKAGE_A是否存在,来决定是否执行脚本中的逻辑// Check if the script is running in the context of project_a if (process.env.IS_PACKAGE_A) { console.log('Running postinstall script for project_a...'); // Add your custom logic here } else { console.log('Skipping postinstall script for package A'); }
3.在业务项目
project_a
中安装A
包,A
包的postinstall
脚本会自动运行cd /path/to/project_a npm install /path/to/A
4.在业务项目
project_a
中监听生命周期事件:如果你希望在project_a
中的postinstall
时机前后做一些清理操作,可在project_a
的package.json
中定义相应的生命周期脚本。project_a
的package.json
{ "name": "project_a", "version": "1.0.0", "scripts": { "prepostinstall": "echo 'Running pre-postinstall script for project_a...'", "postinstall": "echo 'Running postinstall script for project_a...' && node ./scripts/cleanup.js" }, "dependencies": { "A": "file:../path/to/A" } }
project_a
的scripts/cleanup.js
// This script will run after the package is installed console.log('Performing cleanup operations for project_a...');
5.执行顺序:在
project_a
中安装A
包时,脚本的执行顺序如下:
i.project_a
的prepostinstall
脚本
ii.A
包的postinstall
脚本
iii.project_a
的postinstall
脚本
参考
最后, 希望大家早日实现:成为编程高手的伟大梦想!
欢迎交流~
本文版权归原作者曜灵所有!未经允许,严禁转载!对非法转载者, 原作者保留采用法律手段追究的权利!
若需转载,请联系微信公众号:连先生有猫病,可获取作者联系方式!