NPM:执行“npm link”后,模块未被找到。

147
我正在开发两个 NodeJS 模块,第一个名为 aligator,第二个名为 aligator-methods。第二个模块依赖于第一个模块来工作。我同时开发这两个模块,并且想要像在 npm 注册表上一样全局链接 aligator,以便我可以像全局安装它一样使用它。NPM 文档说我需要使用 npm link 来实现此目的,但它并没有起作用。 aligator 模块的 package.json 文件:
{
  "name": "aligator",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "private": true,
  "directories": {
    "doc": "docs",
    "example": "examples",
    "test": "spec"
  },
  "scripts": {
    "test": "gulp jasmine"
  },
  "license": "MIT",
  "devDependencies": {
    "gulp": "^3.6.2",
    "gulp-jasmine": "^0.2.0",
    "gulp-jshint": "^1.6.1",
    "gulp-rename": "^1.2.0",
    "jasmine-node": "^1.14.3"
  },
  "dependencies": {
    "bluebird": "^1.2.4",
    "lodash": "^2.4.1",
    "mathjs": "^0.22.0"
  }
}

模块 aligator-methods 的文件 package.json

{
 "name": "aligator-methods",
 "version": "0.0.1",
 "description": "",
 "main": "index.js",
 "private": true,
 "directories": {
   "doc": "docs",
   "example": "examples",
   "test": "jasmine"
 },
 "scripts": {
   "test": "gulp jasmine"
 },
 "author": "",
 "license": "MIT",
 "devDependencies": {
   "gulp": "^3.6.2",
   "gulp-jasmine": "^0.2.0",
   "gulp-jshint": "^1.6.1",
   "gulp-rename": "^1.2.0",
   "jasmine-node": "^1.14.3"
 },
 "dependencies": {
   "lodash": "^2.4.1",
   "mathjs": "^0.22.0",
   "aligator": "^0.0.1"
 }
}

首先我将该模块进行全局链接:

$ cd ~/aligator
$ npm link
/usr/local/lib/node_modules/aligator -> /Users/roc/aligator

如果我没弄错的话,这已经在我的模块aligator中创建了一个全局引用,现在我可以从任何我想要的地方在计算机上使用这个模块。

然后我去了另一个模块并尝试安装依赖项,但是它给了我这个输出:

$ cd ~/aligator-methods
$ npm install
npm ERR! 404 404 Not Found: aligator
npm ERR! 404
npm ERR! 404 'aligator' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it
npm ERR! 404 It was specified as a dependency of 'aligator-methods'
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, or http url, or git url.

npm ERR! System Darwin 13.2.0
npm ERR! command "node" "/usr/local/bin/npm" "install"
npm ERR! cwd /Users/roc/aligator-methods
npm ERR! node -v v0.10.28
npm ERR! npm -v 1.4.16
npm ERR! code E404
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/roc/aligator-methods/npm-debug.log
npm ERR! not ok code 0

我甚至尝试直接链接它:

$ cd ~/aligator-methods
$ npm link aligator
/Users/roc/aligator-methods/node_modules/aligator -> /usr/local/lib/node_modules/aligator -> /Users/roc/aligator

但它也没起作用。

你有什么想法,可能是因为什么而发生了这种情况吗? 我在某个地方读到可能与我安装的Homebrew制作的nodenpm有关,所以有时需要使用sudo,尽管这似乎不太可能,但我尝试了他们提出的建议,但也没有效果。


在发布的代码中,第一个模块的名称拼写为 aligtor,而你在第二个模块中试图引用它作为 aligator。这可能会导致你的依赖关系崩溃。 - Bruno Toffolo
@BrunoToffolo 是的,你说得对,但在这种情况下,这只是帖子中的一个拼写错误。我已经纠正了它,谢谢。 - Roc
我浪费了4个小时在调试webpack配置上:/ 你救了我的命!+1 - Tomas Ramirez Sarduy
9
哇,我也遇到了package.json中的main问题,感谢您更新答案并提供解决方法! - mattyb
我的链接脚本连接了8个模块,并且在Win10和Ubuntu 19.10,Nodejs 10.22.0和NPM 6.14.6上运行良好。但是,在升级到最新的Ubuntu 20.04和nodej 16.9.1,NPM 7.21.1之后,我无法再进行链接。我尝试了此线程中的所有建议,但都没有成功。NPM -g列表显示软件包已在/usr/lib全局链接,但对于package_name的多个链接仅会创建指向命令列表中最后一个软件包的符号链接,而不会出现错误。所有软件包的主要属性值都正确。我还删除了所有的package_locksnode_module文件夹。 - E.Z.
显示剩余2条评论
20个回答

81
问题在于package.jsonmain属性指向一个不存在的文件。看起来这个问题可能由多个原因引起,所以一定要查看其他答案。

1
有趣的是,这个项目需要 main。大多数情况下我都没有用到它,但是我猜它会引起一些小问题。 - cst1992
2
我在一个 TypeScript 项目中遇到了同样的问题。main 引用了一个不存在的 lib 文件夹。我只需要在项目内运行构建命令来生成这些文件即可。 - Alesso
1
此外,'main' 可能指向一个已存在的文件(通常为 'dist/bundle.js'),但其构建被破坏了,因此没有任何内容被导出。 - OfirD

72

我遇到了这个问题是因为 NVM,我的依赖项使用了一个 Node 版本而另一个依赖于另一个 Node 版本。


1
你或其他人能否链接到解决此问题的位置? - Kevin Danikowski
6
在我的情况下,我需要在两个包中都运行'nvm use <版本>'命令,其中版本号对于这两个包来说是相同的。 - linuxdan
这似乎不是一个通用的解决方案,它在我的情况下不起作用。 - Xanlantos
这对我来说是解决方案。只需为每个相同的Node版本重新安装,就可以解决我的问题。 - Forrest Wilkins

47

删除 package-lock.json 文件,然后再次运行 npm install 命令可以解决我的问题。


4
这可能解决当前问题,但可能会产生更大的问题。锁定文件起着非常重要的作用,_不应该_被删除。简而言之:这是确保每个团队成员使用完全相同依赖关系的机制。您可以在Stack Overflow上查看此答案:https://dev59.com/Q1QJ5IYBdhLWcg3wT0HJ但阅读文档中它存在的原因也是一个好的开始。https://docs.npmjs.com/files/package-lock.json - SKuijers
2
如果有粗体注明这应该是一个绝对的最后手段,我将愿意提高此回答。正如@SKuijers所指出的,锁定文件在维护依赖版本方面发挥了关键作用。假设,依赖版本在package.json中已经被锁定了,但大多数情况下,我看到package-lock.jsonyarn.lock才是守门人。 - FrostyDog
当你的依赖管理器无法管理依赖关系时,这是完全有效的。 - MrYellow
这里真是太赢了♥️,解决了我的问题! - chrismarx

20
当你第一次从aligator目录运行npm link时,你会创建一个从全局node_modules目录到aligator的链接。然后当你从aligator-methods目录运行npm link aligator时,你将从本地安装的node_modules将aligator链接到原始源(如上面的示例中所显示的输出)。一旦完成这个过程,就不需要再安装了,因为它已经被“安装”了。在你运行npm link aligator命令后,你看到了哪些错误?
如果你只想从本地目录安装一个依赖项,你可以尝试使用npm install代替。例如: $ cd ~/aligator-methods $ npm install ../aligator

8
感谢你的努力解决这个问题。我的 npm link 没有显示任何错误。在我的情况下,问题是因为 main 属性指向一个不存在的文件。至于我的 npm install,你是对的,我不需要安装任何东西,npm link 已经完成了一切。感谢你告诉我这个信息,我之前不知道。 - Roc
1
我也遇到了同样的问题,但是还没有找到解决方案...如果我尝试单独引用每个链接的包,除了一个之外其他都可以工作...那个无法工作的只是显示:"错误:找不到模块'module-i-just-linked'"。 - Michael
@Michael 看起来我有一个嵌套在更深的目录中的模块,它试图“动态”地要求失败的模块(即传递给 require() 的字符串名称被传递到模块中),因此我不得不 npm 链接到更深的目录中。 - Michael

13

我的问题最终是由于仓库A使用npm,而仓库B使用yarn导致的,因此我需要在仓库B中运行yarn link,以便通过npm link package-name将其拉入到仓库A中。


9
我成功地解决了类似问题的方法是:
  1. 删除依赖和消费模块中的node_modules
  2. 运行npm unlink --no-save [dependency-module]命令。
  3. 按照npm-link文档中的2条链接命令重新链接。
现在我可以完全在本地测试我的未发布模块了。
另外,有一个npm-pack命令,它可以帮助你测试你的未发布模块,虽然不如上述方法健壮。

只用第二步和第三步就对我起作用了,而且只需一行命令。 - DJ256

7

一定要检查 package.json 中的 main

这是您软件包的入口。这是一个微小的细节,但我花了很长时间才弄清楚。


5
在我遇到的这个问题上进行修复。在npm v5.3.0中,我从将要链接到另一个项目的repo中移除了node_modules文件夹。
我发现,在npm v3之后,他们试图将所有的node_modules依赖项放入一个node_modules目录中(在你的项目中),以尽可能地使结构扁平化。详细信息请参考:http://codetunnel.io/npm-5-changes-to-npm-link/

2
我遇到了类似的问题,我必须执行以下步骤来解决它:
在库中:
1. 将生成问题的库设置为 `peerDependencies` 而不是 `dependencies` 或 `devDependencies` 在 `package.json` 中,例如在我的情况下是 `react`:
"peerDependencies": {
  "react": "^16.8.6",
  ...
}
  1. 运行 npm install
  2. 构建库(在我的情况下,使用 rollup -c npm 脚本)

在我的主要应用程序中

  1. 将我的库的版本更改为在 package.json 中使用相对路径指向我的本地项目,例如
"dependencies": {
  "my-library": "file:../../libraries/my-library",
  ...
}
  1. resolve.symlinks = false添加到我的主应用程序的webpack配置中

  2. --preserve-symlinks-main--preserve-symlinks添加到我的package.json启动脚本中,例如:

"scripts": {
  "build": "set WEBPACK_CONFIG_FILE=all&& webpack",
  "start": "set WEBPACK_CONFIG_FILE=all&& webpack && node --preserve-symlinks-main --preserve-symlinks dist/server.js",
}
  1. 运行 npm install
  2. 运行 npm run start

2

我知道这是一篇旧文章,但在我的情况下,问题是我已经重命名了包目录名称,但是package.json的"name"仍然设置为旧名称。

例如,我的目录名称是package-name,但实际上在package.json中找到的"name"是package-name-b

运行yarn link会创建一个名为"package-name-b"的链接。

然后我尝试运行yarn link package-name,因为我正在使用目录名称。当我将其切换为yarn link package-name-b时,它起作用了。


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