与npm link链接的软件包未更新。

46
我有两个模块 - 我的主项目和一个组件库 - 我想将库链接到主项目中。两者都使用 webpack 和 react 进行工作。所以我做了以下操作:
在 comp-lib 目录下: npm link
在项目目录下: npm link comp-lib
该软件包出现在 node_modules 文件夹中,但是当我在组件库上工作时,主项目中的更改并没有反映出来。我漏掉了什么?
我在 Google 上找不到与此问题相关的内容,而 npm link 文档只是说了一个例子:"现在,对 ~/projects/node-redis 的任何更改都将反映在 ~/projects/node-bloggy/node_modules/node-redis/ 中。"

2
npm link 会创建一个符号链接,因此它基本上是同一个文件夹。您是否确保在修改后重新构建了 comp-lib,因为 package.json 中 main 字段指定的文件将被使用? - HiDeoo
是的,我已经重新构建了它,输出是:根目录下的bundle.js。package.json中的入口点是bundle.js。但是整个文件夹结构也应该被更新,对吧?如果我在components文件夹中添加一个组件,我看不到它。 - SeBe
是的,应该可以。我不知道在Windows上是否能够达到同样的效果,但第一个命令会从你的comp-lib文件夹创建一个符号链接到全局npm文件夹(例如/usr/local/lib/node_modules),第二个命令则从这个之前的全局文件夹创建一个符号链接到project-dir/node_modules/comp-lib。也许你可以检查一下这些链接是否有效并指向正确的文件夹。 - HiDeoo
我刚刚发现,当我手动同步主项目中的comp-lib文件夹时,它会显示更改。IntelliJ在右键单击上下文菜单中提供了此选项。不确定这是否应该以这种方式工作,但至少它可以工作。 - SeBe
6个回答

33

使用npm link命令时,遇到了与已链接的软件包相关的类似问题 - npm link dep 始终选择旧版本的“dep”。

在“dep”文件夹中再次运行 npm link 命令可解决此问题。理论上应该只调用一次,但由于某些原因它有时会失步。

因此,为了可靠地更新链接的项目,请在每次更改后执行以下步骤:

  1. 重建链接的项目
  2. 运行 npm link
  3. 在主机项目中运行 npm link dep

4
你可以在消费模块中使用 npm link ../path/to/dep 来代替分两步操作的方式。 - Dana Woodman

7

我不太记得具体出了哪些问题,也不确定是否有必要,但对我来说,它非常有效。

我将以下迷你脚本添加到 package.json 脚本列表中

"scripts": {
  "clean": "if exist dist ( rd /S /Q dist)",
  "updateLink": "npm run clean && tsc && npm rm my-lib -g && npm link"
}

(将“my-lib”替换为您的包名称)

每当您更改库中的内容时,只需调用npm run updateLink即可。

它的作用:

  • npm run clean 删除dist文件夹。如果您已重命名文件并且typecript编译器没有删除旧文件而是并行构建新文件,则此操作非常有用
  • tsc 编译ts->js到dist文件夹中
  • npm rm my-lib -g && npm link 从全局模块文件夹中删除您的库,并再次添加它。我不记得为什么必须先删除它,但我想解决了一些问题。

出现错误 sh: -c: line 0: syntax error near unexpected token (' sh: -c: line 0: if exist dist ( rd /S /Q dist)' - Sergino

5

确保主项目和依赖项目的Node版本完全匹配。

如果您使用nvm管理多个项目的多个节点版本,则npm link将仅在从中启动npm link(即依赖项目)的节点版本中生成符号链接。


2

现在是2023年,npm似乎仍然存在一些问题,特别是在使用npm link时,这是他们的github问题中普遍存在的烦恼。如果其他答案都不适用于您,以下方法似乎可以解决问题:

选项1:为本地包设置唯一版本号

  1. 在您正在使用的本地包(OP称其为组件库)中,在package.json中将version设置为完全唯一的内容,即以前从未发布过的内容。假设您将其设置为1.1.99
  2. 构建该包,然后运行npm link
  3. 在要使用该包的项目中,运行npm link mypackage@1.1.99

这个问题的一个来源似乎是npm对您尝试链接的内容感到困惑。由于您从未将1.1.99发布到云端甚至本地,因此npm实际上无法将mypackage@1.1.99与除您刚刚创建的本地版本之外的任何内容混淆。令人恼火的是,您当然需要记住在package.json中恢复版本号更改。

选项2:删除nodule_modules缓存

选项1对我们来说一直很可靠;有时候需要更快的方法,通常情况下可以运行以下命令(不是在包中,而是在使用该包的项目中):

rm -rf node_modules/.cache/ && npm link mypackage

npm有时会缓存mypackage的某些旧引用,这似乎可以解决问题。


1
你可能在组件上升级了版本,但忘记在主项目中增加版本号。然后,任何 npm 操作都将下载 package-lock.json 中指定的版本:过时的版本,从而删除由 npm link 设置的链接。

感谢您对软件包版本进行评论。我的问题最终是因为我没有在库项目中递增软件包版本号。我浪费了太多时间来尝试弄清楚发生了什么,但是您的评论最终让我找到了正确的方向。 - Engineer_Andrew

0

我的问题是,我的模块/包在这种情况下正在导出构建文件。我没有修复它,因为我们从多个组件导出多个文件,但如果你遇到这个问题,请将main(以及我的情况下的exports)更改为导出您的模块的任何文件。

  "main": "./dist/shared-lib.umd.js",
  "module": "./dist/shared-lib.es.js",
  "exports": {
    ".": {
      "import": "./dist/shared-lib.es.js",
      "require": "./dist/shared-lib.umd.js"
    },
    "./style": "./dist/style.css"
  }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接