NPM:在找不到“ npm链接”模块之后


88

我正在为NodeJS开发两个模块,第一个模块名为aligator,第二个模块aligator-methods。第二个依靠第一个来工作。我正在同时开发这两个模块,我想进行全局链接,aligator因此可以像在npm注册表中一样使用它,而只是在全局范围内安装它。要执行此NPM文档,我需要使用npm link它,但是它不起作用。

package.json模块文件aligator

{
  "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"
  }
}

package.json模块文件aligator-methods

{
 "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

但这也不起作用。

对可能发生的事情有任何想法吗?我在某处读到它可能与我的nodenpm的安装有关,因为它是由Homebrew制作的,因此有时我需要使用sudo,这似乎不太可能,但是我尝试了他们的建议,但也没有用。


在发布的代码中,第一个模块的名称是拼写的aligtor,您尝试在第二个模块中将其引用为aligator。这也可能使您的依赖项崩溃。
布鲁诺·托佛洛

@BrunoToffolo是的,您是对的,但是在这种情况下,这只是帖子中的拼写错误。我已经纠正了,谢谢。
Roc

失去了4小时的痛苦生活,欺骗了Webpack配置:/您救了我的命!+1
Tom Sarduy

8
哇,我曾与同样的问题main我的package.json,感谢您用您的修复更新的答案!
黑曜石

如果您找到了答案,则最好将其发布为答案并将问题设置为已解决:)
Alberto S.

Answers:


39

由于NVM,我遇到了这个问题,我为依赖项运行一个版本的节点,为受抚养者运行另一个版本的节点。


1
您或其他任何人都可以链接到偶然解决此问题的位置吗?
凯文·丹尼科夫斯基'18

4
就我而言,我需要在两个软件包上都运行“ nvm use <VERSION>”,其中两个软件包的VERSION相同。
linuxdan

29

删除package-lock.json然后npm install再次运行可以为我解决问题。


2
这样可以解决当前问题,但可能会造成更大的问题。锁定文件起着非常重要的作用,不应删除。简而言之:它的机制可确保每个团队成员都使用完全相同的依赖项。您可以在堆栈溢出时检查以下答案:stackoverflow.com/questions/54124033/… 但是通读文档中存在的原因也是一个不错的开始。docs.npmjs.com/files/package-lock.json
SKuijers

如果有一个粗体字表示这应该是完全不得已的话,我将愿意回答这个问题。正如@SKuijers指出的那样,锁定文件在维护依赖项版本中起着至关重要的作用。大概,依赖版本也已在中被锁定package.json,但是大多数时候我看到package-lock.jsonoryarn.lock一直是它的关守者。
FrostyDog

28

问题是的main属性package.json指向了不存在的文件。看来问题可能是由多种原因引起的,因此请务必查看其他答案。


天哪,我想投票50次,每次投票都自己一次面对面。

有趣的是知道该项目需要main。大多数情况下,我没有这样做,但是猜测它会造成这些小问题。
cst1992

好发现!我看到了您的回答,立即知道这是我的问题:)。
slashp

11

首次npm linkaligator目录运行时,您将创建一个从全局node_modules目录到的链接aligator。然后,npm link aligatoraligator-methods目录运行时,您aligator将从本地安装的node_modules链接到原始源(如以上示例中的输出所示)。一旦完成,就不再需要安装了,因为它已经“安装”了。运行npm link aligator命令后,您看到什么错误?

如果只想从本地目录安装依赖项,则可以尝试使用npm install代替。例如:

$
cd〜/ aligator-methods $ npm install ../aligator


5
感谢您为解决此问题所做的努力。我npm link没有显示任何错误。在我的情况下,问题是该属性main指向一个不存在的文件。至于我npm install是对的,我不需要安装任何工具npm link。谢谢,我不知道。
Roc

1
我遇到了同样的问题,但没有找到解决方案...如果我尝试单独要求每个链接的程序包,除了一个程序外,其他所有程序都可以工作...一个无效的程序只是说:“错误:找不到模块'模块-i-just-link'”。
迈克尔”

@Michael似乎我有一个模块嵌套在一个更深的目录中,试图“动态”地请求失败的模块(即,传递给require()的字符串的名称已传递给该模块),因此我不得不使用npm链接到更深的目录。
迈克尔(Michael)

4

我的问题最终是回购A正在使用npm而回购B正在使用yarn,因此我需要yarn link在回购B中运行才能将其通过npm link package-name回购A。


您,先生,我过得愉快!谢谢
Alec

2

修正了我这个问题的版本;在npm v5.3.0中,我node_modules从链接到另一个项目的仓库中删除。

我发现,在npm v3之后,他们尝试将所有node_modules依赖项放入一个node_modules目录(项目中的一个目录)中,以尽可能扁平化结构(http://codetunnel.io/npm-5-changes-to-npm -link /)。


2

对我有用的是:

  1. 删除node_modules依赖项和使用者模块中的。
  2. npm unlink --no-save [dependency-module]
  3. 按照npm-link用2链接命令重新链接

现在,我可以在本地全面测试未发布的模块了。

此外,有一个npm pack命令,虽然功能不那么强大,但可以帮助您测试未发布的模块。

npm包装


1

对我来说,这是在我本地软件包的版本号从0.1.0减少到0.0.1时发生的。在我链接到该软件包的项目中,我仍在使用更高的版本号。更新依赖性package.json修复它。


0

使用peerDependency时

我正在开发两个软件包stejs,和stejs-loaderstejs-loaderstejs作为peerDependency。当我运行npm link stejs-loadernpm link stejs在项目中遇到stejs-loader找不到的错误时stejs。我通过npm link stejs在目录中运行来解决它stejs-loader


0

检查tsconfig模块

如果像我一样,您碰巧将tsconfigmodule从更改es5esnext或其他,则moduleResolution默认值可能已更改。

如果moduleResolution未设置为“ node”,则打字稿将无法解析node_modules软件包。

您可以在“编译器选项”页面上阅读有关默认值如何取决于的值的信息module,默认值又取决于的值target-但可能已将其明确设置为“ node”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.