npm publish命令拦截器, 提供两种拦截方式:
- 提示引导: 在
npm publish
时只做拦截, 并提示用户应该使用其它的命令去发布该包 - 重写覆盖: 重写命令覆盖原本的
npm publish
行为
npm i -g np-guard
or npm i np-guard -D
{
"script": {
"prepublishOnly": "npg"
}
}
这时候运行 npm publish
, 请求就会被拦截
例如 npg --cmd 'npm run release' --color
, terminal会输出以下信息:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! `npm publish` is forbidden for this package. !!
!! Use `npm run release` instead. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
options:
version
(alias:v
)help
(alias:h
)silent
(alias:s
): 是否输出提示信息, 默认为非静默模式, 即输出msg
(alias:m
): 自定义要输出的信息, 默认为npg自带的提示信息cmd
(aliasC
): 如果使用npg自带的提示信息, cmd则是一个信息插槽color
(aliasc
): 输出的文字颜色, 默认为white
, 可选值可以通过help
参数查看bg
(aliasb
): 输出的文字背景色, 默认为red
, 可选值可以通过help
参数查看skip-npg
(aliasS
): 跳过npg拦截
, 用于真实的npm publish
运行阶段overwrite
(aliaso
): 重写覆盖原本的npm publish
行为, 如npg -o 'npm run release'
color
和 bg
的可选值:
- `color`` 可选值有: black, red, green, yellow, blue, magenta, cyan, white, gray, grey
- `bg`` 可选值有: black, red, green, yellow, blue, magenta, cyan, white
环境变量:
SKIP_NPG=1
与skip-npg
作用相同
最佳搭档 —— np
在package.json中配置, 下面这种的目的是: 提示引导
{
"script": {
"prepublishOnly": "npg --cmd 'npm run release'",
"release": "npx cross-env SKIP_NPG=1 np --no-yarn --yolo --branch release"
}
}
这里必须设置环境变量 SKIP_NPG=1
, 因为 np
底层调用的还是 npm publish
, 会导致与 prepublishOnly
钩子循环调用造成卡死
下面这种的目的是重写覆盖默认的 npm publish
行为
{
"script": {
"prepublishOnly": "npg -o 'npm run release'",
"release": "np --no-yarn --yolo --any-branch"
}
}
在 npm publish
后, terminal中会有这样的报错, 这属于无法避免的正常情况
npm ERR! code 1
npm ERR! path /Volumes/dev/np-guard
npm ERR! command failed
npm ERR! command sh -c exit 1
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/zhuangjunlin/.npm/_logs/2022-07-01T17_18_43_293Z-debug-0.log
原因: npm publish拦截
的实现是通过 exit 1
的方式, 这属于 npm publish
执行的报错,并不影响 prepublishOnly
的执行