npm-query

依赖项选择器查询

选择 CLI 版本

概述

npm query <selector>

描述

npm query 命令允许使用 css 选择器来检索依赖项对象的数组。

将 npm 查询管道传输到其他命令

# find all dependencies with postinstall scripts & uninstall them
npm query ":attr(scripts, [postinstall])" | jq 'map(.name)|join("\n")' -r | xargs -I {} npm uninstall {}
# find all git dependencies & explain who requires them
npm query ":type(git)" | jq 'map(.name)' | xargs -I {} npm why {}

扩展用例和查询

// all deps
*
// all direct deps
:root > *
// direct production deps
:root > .prod
// direct development deps
:root > .dev
// any peer dep of a direct deps
:root > * > .peer
// any workspace dep
.workspace
// all workspaces that depend on another workspace
.workspace > .workspace
// all workspaces that have peer deps
.workspace:has(.peer)
// any dep named "lodash"
// equivalent to [name="lodash"]
#lodash
// any deps named "lodash" & within semver range ^"1.2.3"
#lodash@^1.2.3
// equivalent to...
[name="lodash"]:semver(^1.2.3)
// get the hoisted node for a given semver range
#lodash@^1.2.3:not(:deduped)
// querying deps with a specific version
// equivalent to...
[name="lodash"][version="2.1.5"]
// has any deps
:has(*)
// deps with no other deps (ie. "leaf" nodes)
:empty
// manually querying git dependencies
[repository^=github:],
[repository^=git:],
[repository^=https://github.com],
[repository^=http://github.com],
[repository^=https://github.com],
[repository^=+git:...]
// querying for all git dependencies
:type(git)
// get production dependencies that aren't also dev deps
.prod:not(.dev)
// get dependencies with specific licenses
[license=MIT], [license=ISC]
// find all packages that have @ruyadorno as a contributor
:attr(contributors, [[email protected]])

示例响应输出

  • 返回依赖项对象的数组,其中可能包含同一包的多个副本,这些副本可能已链接或未链接,也可能已去重。
[
{
"name": "",
"version": "",
"description": "",
"homepage": "",
"bugs": {},
"author": {},
"license": {},
"funding": {},
"files": [],
"main": "",
"browser": "",
"bin": {},
"man": [],
"directories": {},
"repository": {},
"scripts": {},
"config": {},
"dependencies": {},
"devDependencies": {},
"optionalDependencies": {},
"bundledDependencies": {},
"peerDependencies": {},
"peerDependenciesMeta": {},
"engines": {},
"os": [],
"cpu": [],
"workspaces": {},
"keywords": [],
...
},
...

预期一定数量的结果

一个常见的用途 npm query 是确保您的树中只有一个特定依赖项的版本。这在依赖于 typescript 的生态系统中尤为常见,在这些生态系统中,将状态拆分到两个不同但同名的包中会导致错误。您可以使用 --expect-results--expect-result-count 在您的设置中确保 npm 如果您的树不像您希望的那样,将会退出并返回一个退出代码。

$ npm query '#react' --expect-result-count=1

也许您想快速检查是否有任何可以更新的生产依赖项。

$ npm query ':root>:outdated(in-range).prod' --no-expect-results

仅包锁模式

如果仅包锁已启用,则仅加载包锁(或 shrinkwrap)中的信息。这意味着依赖项的 package.json 文件中的信息将不会包含在结果集中(例如描述、主页、引擎)。

配置

全局

  • 默认值:false
  • 类型:布尔值

在“全局”模式下运行,以便将包安装到 prefix 文件夹而不是当前工作目录中。请参阅 文件夹 了解行为差异的更多信息。

  • 包被安装到 {prefix}/lib/node_modules 文件夹,而不是当前工作目录。
  • bin 文件链接到 {prefix}/bin
  • 手册页链接到 {prefix}/share/man

工作区

  • 默认值
  • 类型:字符串(可以设置多次)

启用在当前项目的配置工作区的上下文中运行命令,同时通过仅运行此配置选项定义的工作区来进行过滤。

对于 workspace 配置的有效值为:

  • 工作区名称
  • 工作区目录的路径
  • 父工作区目录的路径(将导致选择该文件夹中的所有工作区)

当为 npm init 命令设置时,这可以设置为尚未存在的工作区文件夹,以创建文件夹并将其设置为项目中的全新工作区。

此值不会导出到子进程的环境中。

工作区

  • 默认值:null
  • 类型:null 或布尔值

设置为 true 以在配置的 所有 工作区的上下文中运行命令。

明确将其设置为 false 将导致像 install 这样的命令完全忽略工作区。当未明确设置时

  • node_modules 树进行操作的命令(安装、更新等)将把工作区链接到 node_modules 文件夹中。- 执行其他操作的命令(测试、执行、发布等)将在根项目上运行,除非workspace 配置中指定了一个或多个工作区。

此值不会导出到子进程的环境中。

include-workspace-root

  • 默认值:false
  • 类型:布尔值

当命令为工作区启用时,包含工作区根目录。

当设置为 false 时,通过 workspace 配置指定单个工作区,或通过 workspaces 标志指定所有工作区,将导致 npm 仅对指定的工作区进行操作,而不对根项目进行操作。

此值不会导出到子进程的环境中。

package-lock-only

  • 默认值:false
  • 类型:布尔值

如果设置为 true,则当前操作将仅使用 package-lock.json,忽略 node_modules

对于 update,这意味着仅 package-lock.json 将被更新,而不是检查 node_modules 并下载依赖项。

对于 list,这意味着输出将基于 package-lock.json 描述的树,而不是 node_modules 的内容。

expect-results

  • 默认值:null
  • 类型:null 或布尔值

告诉 npm 是否期望命令返回结果。可以是 true(期望一些结果)或 false(期望没有结果)。

此配置不能与以下配置一起使用:expect-result-count

expect-result-count

  • 默认值:null
  • 类型:null 或数字

告诉 npm 预期命令返回特定数量的结果。

此配置不能与以下配置一起使用:expect-results

另请参阅