# npm diff
注册中心差异对比命令
# 概要
npm diff [...<paths>]
# 描述
与 git diff 对应的命令类似,此命令是文件差异补丁将打印发布到 npm 注册中心的包的文件差异。
- npm diff --diff=<spec-a> --diff=<spec-b>
使用注册中心说明符比较两个包版本,例如 npm diff --diff=pkg@1.0.0 --diff=pkg@^2.0.0。它也可以在任何软件包的分支之间进行比较,例如 npm diff --diff=pkg@1.0.0 --diff=pkg-fork@1.0.0。
任何有效的规范都可以使用,这样就可以比较目录或 git 存储库,例如 npm diff --diff=pkg@latest --diff=./packages/pkg。
下面是一个比较注册中心中名为 abbrev 的包的两个不同版本的例子:
npm diff --diff=abbrev@1.1.0 --diff=abbrev@1.1.1
对于成功,输出是这样的:
diff --git a/package.json b/package.json
index v1.1.0..v1.1.1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "abbrev",
-  "version": "1.1.0",
+  "version": "1.1.1",
   "description": "Like ruby's abbrev module, but in js",
   "author": "Isaac Z. Schlueter <i@izs.me>",
   "main": "abbrev.js",
鉴于 npm 规范的灵活性,你也可以像使用 npm install 一样针对本地目录或 git repos:
npm diff --diff=https://github.com/npm/libnpmdiff --diff=./local-path
在上面的例子中,我们可以将 github.com/npm/libnpmdiff 处 git repo 中安装包的内容与 ./local-path 中包含有效包的内容进行比较,例如原始包的修改副本。
- npm diff(在包目录中,没有参数)
如果将包发布到注册中心,npm diff 将获取标记为 latest 的 tarball 版本(可以使用 tag 选项配置此值),并继续比较该tarball中出现的文件的内容与本地文件系统中的当前文件。
该工作流为包作者提供了一种方便的方法,可以查看与该包的最新发布版本对比,哪些包跟踪的文件发生了更改。
- npm diff --diff=<pkg-name>(在包目录中)
当使用单个包名(没有版本或标记说明符)作为参数时,npm diff 将以类似于  npm-outdated 的方式工作,并访问注册中心,确定当前已发布的包的哪个版本命名 <pkg-name> 将满足其依赖声明的 semver-range,一旦知道该特定版本,npm diff 将打印比较 <pkg-name> 在本地文件系统中找到的当前版本与注册中心返回的特定版本的文件差异。
给定当前安装的名为 abbrev 的包:
npm diff --diff=abbrev
这将从注册中心请求其最新版本,如果版本号不相同,则将打印一个比较当前安装的版本与此新版本的差异。
- npm diff --diff=<spec-a>(在包目录中)
类似于只使用单个包名,如果您希望将已安装包的本地版本与 <spec-a> 中提供的 version/tag/semver-range 进行比较,也可以声明完整的注册中心说明符版本。
例如:假设 pkg@1.0.0 安装在当前 node_modules 文件夹下,运行如下命令:
npm diff --diff=pkg@2.0.0
它实际上是的别名 npm diff --diff=pkg@1.0.0 --diff=pkg@2.0.0。
- npm diff --diff=<semver-a> [--diff=<semver-b>](在包目录中)
将 npm diff 与永远有效的版本号一起使用是比较当前包的不同版本的简便方法。
需要在包目录下运行,这样对于名为 pkg 的包,运行 npm diff --diff=1.0.0 --diff=1.0.1 就相当于运行 npm diff --diff=pkg@1.0.0 --diff=pkg@1.0.1。
如果只提供单个参数 <version-a>,那么将比较当前本地文件系统与该版本。
这是一个比较当前项目目录的两个特定版本(发布到配置的注册中心)的示例:
npm diff --diff = 1.0.0 --diff = 1.1.0 
请注意,标签名称不是有效的 --diff 参数值,如果您希望与已发布的标签进行比较,则必须使用pkg@tagname 语法。
# 过滤文件
也可以使用文件名或 globs 模式匹配来指定位置参数,以便将 diff 差异的结果限制为给定包的一个文件子集,例如:
npm diff --diff=pkg@2 ./lib/ CHANGELOG.md
在上面的例子中,diff 输出只会打印位于文件夹 ./lib/ 中的文件的内容,以及 CHANGELOG.md 文件中更改的代码行。
# 配置
# diff
- Default:
- Type: String (可以设置多次)
在 npm diff 中定义比较的参数
# diff-name-only
- Default: false
- Type: Boolean
使用 npm diff 时只打印文件名
# diff-unified
- Default: 3
- Type: Number
在 npm diff 中打印的上下文行数
# diff-ignore-all-space
- Default: false
- Type: Boolean
在比较 npm diff 中的行时忽略空白。
# diff-no-prefix
- Default: false
- Type: Boolean
不要在 npm diff 输出中显示任何源或目标前缀。
注意:这会导致 npm diff 忽略 --diff-src-prefix 和 --diff-dst-prefix 配置。
# diff-src-prefix
- Default: "a/"
- Type: String
在 npm diff 输出中使用的源前缀。
# diff-dst-prefix
- Default: "b/"
- Type: String
在 npm diff 输出中使用的目标前缀。
# diff-text
- Default: false
- Type: Boolean
将所有文件视为 npm diff 中的文本。
# global
- Default: false
- Type: Boolean
以 “global” 模式运行,会将包安装到 prefix 文件夹而不是当前工作目录中。有关行为差异的更多信息,请参阅 folders。
- 软件包被安装到 {prefix}/lib/node_modules文件夹中,而不是当前工作目录中。
- bin 文件链接到 {prefix}/bin
- 操作说明链接到 {prefix}/share/man
# tag
- Default: "latest"
- Type: String
如果你要求 npm 安装一个包,但没有告诉它一个特定的版本,那么它会安装指定的标签。
如果没有给出明确的标记,还将添加到 npm tag 命令指定的 package@version 中的标记。
当 npm diff 命令使用时,这是用于获取 tarball 的标记,默认情况下将与本地文件进行比较。
# workspace
- Default:
- Type: String (可以设置多次)
启用在当前项目的已配置工作区的上下文中运行命令,同时通过仅运行此配置选项定义的工作区进行过滤。
workspace 配置的有效值如下:
- 工作区名称
- 工作区目录的路径
- 父工作区目录的路径(将导致选择该文件夹中的所有工作区)
为 npm init 命令设置时,可以将其设置为尚不存在的工作空间的文件夹,以创建文件夹并将其设置为项目中的全新工作空间。
此值不会导出到子进程的环境中。
# workspaces
- Default: null
- Type: null or Boolean
设置为 true 将在所有配置的工作区中运行该命令。
显式地将此设置为 false 将导致如下命令 install 完全忽略工作空间。当没有显式设置时:
- 在 node_modules树上操作的命令 (install, update, etc.) 时,将把工作区链接到node_modules文件夹中。做其他事情的命令 (test, exec, publish, etc.) 将在根项目上操作,除非在workspace配置中指定了一个或多个工作空间。
此值不会导出到子进程的环境中。
# include-workspace-root
- Default: false
- Type: Boolean
当为某个命令启用工作区时,请包含工作区根目录。
当为 false 时,通过 workspace 配置指定单个工作空间,或通过 workspaces 标志指定所有工作空间,将导致 npm 仅在指定的工作空间上运行,而不是在根项目上运行。
此值不会导出到子进程的环境中。
