npx link
npm link 更安全且功能增强的版本。
为什么 npm link 不安全?请阅读博客文章。
功能
- 🔗 链接依赖项,同时保留之前的链接
- 🛡 仅解析为本地路径
- 🔥 通过配置文件快速链接多个包
- 💫 深度链接,用于快速链接多个包
已经是赞助商? 加入 Development repo 的讨论!
术语
-
依赖包
被链接的包。这通常是一个库。
-
消费包
您希望将 依赖包 作为其依赖项进行链接的项目。这通常是一个应用程序。
consuming-package/node_modules/dependency-package→dependency-package
用法
链接一个包
从 Consuming package 目录中,链接 Dependency package:
npx link <dependency-package-path>
这会在 Consuming package 的 node_modules 内创建一个符号链接,指向 Dependency package。
🛡️ 安全链接
与
npm link不同,它不会全局安装 Dependency package 或重新安装项目依赖项。
发布模式
使用符号链接可能无法完全复现标准 npm install 所获得的精确环境。这种差异主要源于通过符号链接引用的包保留了其开发 node_modules 目录。这可能会导致问题,尤其是在多个包依赖同一个库时。
这是一个示例
在生产环境中,npm install 会检测公共依赖项,并仅为共享依赖项安装一个实例。然而,当存在指向依赖项开发目录的符号链接时,这些依赖项的独立副本会从开发 node_modules 中解析。
假设有一个 App A,它依赖于 Package B,并且它们都依赖于 Library C:
-
生产环境
npm install检测到 App A 和 Package B 都依赖于 Library C,并且只为它们安装一份 Library C 副本以供共享。 -
符号链接环境
App A 拥有其 Library C 的副本,而 Package B 也拥有其 Library C 的开发副本——可能具有不同的版本。因此,当你运行应用程序时,它会加载两个不同版本的 Library C,从而导致意外结果。
发布模式 有助于在您的开发环境中复制生产环境。
设置说明
-
在 依赖包 中,运行
npm pack以创建 tarball:cd dependency-package-path npm pack
这会在当前目录生成一个 tarball(.tgz)文件。从该文件安装可模拟已发布包的条件,而无需实际发布。
> **提示:** 如果该依赖项已从 npm 安装且依赖项的 `package.json` 没有更改,则可以跳过此步骤。
2. 在 Consuming package 中
1. 从 _步骤 1_ 安装依赖项 tarball
```sh
npm install --no-save <dependency-tarball-path>
```
这会设置与生产环境中使用的相同的 node_modules 树。
2. 链接 _Dependency package_
```sh
npx link publish <dependency-package-path>
```
这会在 node_modules/dependency 中创建指向 Dependency package 特定发布资产的硬链接。
为什么使用硬链接而不是符号链接?
符号链接方法的另一个问题是,Node.js 以及流行的打包工具会根据模块的 realpath 而非导入路径(符号链接路径)来查找 node_module 目录。通过使用硬链接,我们可以防止这种行为,并确保 node_modules 目录使用我们在 Step 2 中设置的生产树进行解析。
- 开始开发!
您对 Dependency package 所做的任何更改都将反映在 Consuming package 的 node_modules 目录中。
注意: 如果 依赖包 生成了新文件,您需要重新运行
npx link publish <dependency-package-path>以创建新的硬链接。
配置文件
在 Consuming package 的根目录下创建一个 link.config.json(或 link.config.js)配置文件,以自动设置到多个 Dependency packages 的链接。
示例 link.config.json:
{
"packages": [
"/path/to/dependency-path-a",
"../dependency-path-b",
],
}
该配置具有以下类型模式:
type LinkConfig = {
// Whether to run `npx link` on dependency packages with link.config.json
deepLink?: boolean
// List of dependency packages to link
packages?: string[]
}
注意: 不建议将此文件提交到源代码控制,因为这是用于本地开发和本地路径的。
要链接在 link.config.json 中定义的依赖项,请运行:
npx link
深度链接
默认情况下,npx link 仅链接 Consuming package。然而,在某些情况下,Dependency packages 也需要进行链接配置。
Deep linking 会递归地对每个具有 link.config.json 文件的链接依赖项运行 link。
通过 link.config.json 中的 --deep 标志或 deepLink 属性启用。
npx link --deep
常见问题
为什么我应该使用 npx link 而不是 npm link?
因为 npm link 使用复杂且危险。并且 npx link 提供了更多功能,例如 Publish mode。
如何移除链接?
运行 npm install,它应该会移除它们。
npm install 通过确保所有包都正确安装来强制保证 node_modules 的完整性。恢复链接是此操作的副作用。
为什么 npx link 指向 ln?
你必须使用 npx v7 或更高版本。使用 npx -v 检查版本。
在已弃用的 npx v6 中,本地二进制文件优先于 npm 模块,因此 npx link 可以指向原生的 link/ln 命令:
$ npx link
usage: ln [-s [-F] | -L | -P] [-f | -i] [-hnv] source_file [target_file]
ln [-s [-F] | -L | -P] [-f | -i] [-hnv] source_file ... target_dir
link source_file target_file
要解决此问题,请先全局安装 link:
$ npm i -g link
$ npx link
相关
npx ci- 更好的npm ci。

