ITADN
privatenumber/link · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

npx link

npm link 更安全且功能增强的版本。

为什么 npm link 不安全?请阅读博客文章

功能

  • 🔗 链接依赖项,同时保留之前的链接
  • 🛡 仅解析为本地路径
  • 🔥 通过配置文件快速链接多个包
  • 💫 深度链接,用于快速链接多个包

已经是赞助商? 加入 Development repo 的讨论!

术语

  • 依赖包

    被链接的包。这通常是一个库。

  • 消费包

    您希望将 依赖包 作为其依赖项进行链接的项目。这通常是一个应用程序。

    consuming-package/node_modules/dependency-packagedependency-package

用法

链接一个包

Consuming package 目录中,链接 Dependency package

npx link <dependency-package-path>

这会在 Consuming packagenode_modules 内创建一个符号链接,指向 Dependency package

🛡️ 安全链接

npm link 不同,它不会全局安装 Dependency package 或重新安装项目依赖项。

发布模式

使用符号链接可能无法完全复现标准 npm install 所获得的精确环境。这种差异主要源于通过符号链接引用的包保留了其开发 node_modules 目录。这可能会导致问题,尤其是在多个包依赖同一个库时。

这是一个示例

在生产环境中,npm install 会检测公共依赖项,并仅为共享依赖项安装一个实例。然而,当存在指向依赖项开发目录的符号链接时,这些依赖项的独立副本会从开发 node_modules 中解析。

假设有一个 App A,它依赖于 Package B,并且它们都依赖于 Library C

  • 生产环境

    npm install 检测到 App APackage B 都依赖于 Library C,并且只为它们安装一份 Library C 副本以供共享。

  • 符号链接环境

    App A 拥有其 Library C 的副本,而 Package B 也拥有其 Library C 的开发副本——可能具有不同的版本。因此,当你运行应用程序时,它会加载两个不同版本的 Library C,从而导致意外结果。

发布模式 有助于在您的开发环境中复制生产环境。

设置说明

  1. 依赖包 中,运行 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 中设置的生产树进行解析。

  1. 开始开发!

您对 Dependency package 所做的任何更改都将反映在 Consuming packagenode_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

常见问题

因为 npm link 使用复杂且危险。并且 npx link 提供了更多功能,例如 Publish mode

如何移除链接?

运行 npm install,它应该会移除它们。

npm install 通过确保所有包都正确安装来强制保证 node_modules 的完整性。恢复链接是此操作的副作用。

你必须使用 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

赞助商