Node 项目可以用 npm pkg get 快速看 package.json 字段

50 次浏览5 条回复

有时候只想确认 package.json 里的某个字段,不用打开编辑器翻文件。npm 自带的 npm pkg get 就够用。

环境:Node.js 18+,npm 8+。临时试一下:

mkdir npm-pkg-get-demo && cd npm-pkg-get-demo
npm init -y
npm pkg set scripts.lint="eslint ."
npm pkg get scripts
npm pkg get scripts.lint

它会按 JSON 打印结果,适合脚本里顺手读一下配置。比如 CI 里想先确认某个 script 是否存在,比 cat package.json 再肉眼找清楚一点。

如果只是查看,npm pkg get 不会改文件;要写入才用 npm pkg set。

还可以直接取嵌套字段,做 CI 里的条件判断挺方便:

npm pkg get "scripts.lint"
npm pkg get "dependencies.typescript"

字段不存在时先注意输出和 shell 判断方式,别直接把整段 JSON 当布尔值用。要给脚本消费的话,也可以把结果交给 node/jq 再判断,避免字符串比较踩坑。

uitfLv1#1

还可以直接取嵌套字段,做 CI 里的条件判断挺方便:

npm pkg get "scripts.lint"
npm pkg get "dependencies.typescript"

字段不存在时先注意输出和 shell 判断方式,别直接把整段 JSON 当布尔值用。要给脚本消费的话,也可以把结果交给 node/jq 再判断,避免字符串比较踩坑。

单仓库里有多个 workspace 时也挺好用,可以限定某个包读取:

npm pkg get version --workspace=packages/web
npm pkg get scripts.build --workspace=packages/web

这样 CI 里不用自己解析 package.json。要批量看所有 workspace,再用 --workspaces;不过输出结构会按 workspace 组织,脚本消费前最好先固定一下 npm 版本和字段格式。

MukiLv1#2

单仓库里有多个 workspace 时也挺好用,可以限定某个包读取:

npm pkg get version --workspace=packages/web
npm pkg get scripts.build --workspace=packages/web

这样 CI 里不用自己解析 package.json。要批量看所有 workspace,再用 --workspaces;不过输出结构会按 workspace 组织,脚本消费前最好先固定一下 npm 版本和字段格式。

workspace 这点很实用。再补一个容易踩的坑:--workspace 可以写 workspace 名称或路径,最好和项目里的配置对应起来,别想当然把包名当目录名。CI 里可以先跑 npm pkg get name --workspace=packages/web 确认命中了哪个包,再取具体字段。多个 workspace 的输出结构会变,固定 npm 版本确实比较稳。

Ryan小满Lv1#3

workspace 这点很实用。再补一个容易踩的坑:--workspace 可以写 workspace 名称或路径,最好和项目里的配置对应起来,别想当然把包名当目录名。CI 里可以先跑 npm pkg get name --workspace=packages/web 确认命中了哪个包,再取具体字段。多个 workspace 的输出结构会变,固定 npm 版本确实比较稳。

如果 CI 只是要判断脚本是否存在,我会把读取展示和校验分开,避免依赖 npm pkg get 的输出格式。比如:

node -e "const p=require('./packages/web/package.json'); if (!p.scripts?.build) process.exit(1)"

需要打印值时再用 npm pkg get,这样失败条件也更明确。

雾很大Lv1#4

如果 CI 只是要判断脚本是否存在,我会把读取展示和校验分开,避免依赖 npm pkg get 的输出格式。比如:

node -e "const p=require('./packages/web/package.json'); if (!p.scripts?.build) process.exit(1)"

需要打印值时再用 npm pkg get,这样失败条件也更明确。

这个区分挺对:展示值用 npm pkg get,做门禁时直接让 Node 返回退出码更稳。要兼顾 workspace 的路径和包名,也可以先用 npm pkg get name --workspace=... 校验目标,再执行检查;否则路径写错时,CI 日志里不一定一眼看出查的是哪个包。