NPM:找不到“npm link”模块后

Posted

技术标签:

【中文标题】NPM:找不到“npm link”模块后【英文标题】:NPM: After "npm link" module is not found 【发布时间】:2014-08-24 09:20:34 【问题描述】:

我正在为 NodeJS 开发两个模块,第一个模块名为 aligator,第二个模块名为 aligator-methods。第二个取决于第一个工作。我正在同时开发这两个模块,我想全局链接aligator,这样我就可以像在 npm 注册表上一样使用它,我只是在全局范围内安装它。要做到这一点,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

但它也不起作用。

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

【问题讨论】:

在发布的代码中,第一个模块的名称拼写为aligtor,您尝试在第二个模块中将其称为aligator。这也可能使你的依赖崩溃。 @BrunoToffolo 是的,你是对的,但在这种情况下,这只是帖子中的拼写错误。我已经更正了,谢谢。 在欺骗 webpack 配置的悲惨生活中失去了 4 个小时:/ 你救了我的命! +1 哇,我的package.jsonmain 也遇到了同样的问题,感谢您通过修复更新答案! 如果您找到了答案,最好将其发布为答案并将问题设置为已解决 :) 【参考方案1】:

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

【讨论】:

您或其他人能否链接到偶然解决此问题的位置? 在我的情况下,我需要在两个包上运行 'nvm use ',其中两个包的 VERSION 相同。 这似乎不是一个通用的解决方案,它在我的情况下不起作用。 这就是我的解决方案。只需为每个具有相同节点版本的设备重新安装即可解决我的问题。【参考方案2】:

问题是package.jsonmain 属性指向一个不存在的文件。似乎该问题可能由于多种原因而发生,因此请务必查看其他答案。

【讨论】:

有趣的是,该项目需要main。大多数情况下我没有它,但猜测它会产生这些小问题。 我在打字稿项目中遇到了同样的问题。 main 引用了一个不存在的 lib 文件夹。我只需要在项目中运行 build 来生成文件。 另外,main 可能指向一个现有文件(通常是 dist/bundle.js),但其构建因某种原因被破坏,因此没有导出任何内容。 你拯救了我的一天,非常感谢!【参考方案3】:

删除 package-lock.json 然后运行 ​​npm install 再次为我解决了这个问题。

【讨论】:

这可以解决当前的问题,但可能会产生一些更大的问题。锁定文件起着非常重要的作用,不应该被删除。简而言之:它是确保每个团队成员使用完全相同的依赖项的机制。您可以在堆栈溢出时查看此答案:***.com/questions/54124033/… 但通读它存在于文档中的原因也是一个好的开始。 docs.npmjs.com/files/package-lock.json 如果有一个粗体注释表明这应该是最后的手段,我愿意提高这个答案。正如@SKuijers 指出的那样,锁定文件在维护依赖版本方面起着至关重要的作用。据推测,依赖版本也已锁定在package.json 中,但大多数时候我看到package-lock.jsonyarn.lock 一直是这方面的看门人。【参考方案4】:

当您第一次从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

【讨论】:

感谢您为解决此问题所做的努力。我的npm link 没有显示任何错误。我的问题是属性main 指向一个不存在的文件。至于我的npm install,你是对的,我不需要安装任何东西,npm link 就可以做到这一切。谢谢你,我不知道。 我遇到了同样的问题,但还没有找到解决方案...如果我尝试单独要求每个链接的包,除了一个之外,所有的包都可以工作......那个不起作用的只是说: “错误:找不到模块'module-i-just-linked'”。 @Michael 看起来我有一个模块嵌套在更深的目录中,它试图“动态地”要求失败的模块(即传递给 require() 的字符串的名称被传递给模块),因此我必须 npm 链接到更深的目录。【参考方案5】:

我的问题最终是 repo A 使用 npm 而 repo B 使用 yarn,所以我需要在 repo B 中运行 yarn link 以便通过 npm link package-name 将其拉入 repo A。

【讨论】:

【参考方案6】:

对我有用的是:

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

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

此外,还有一个 npm pack 命令可以帮助您测试未发布的模块,虽然不是那么健壮。

npm-pack

【讨论】:

【参考方案7】:

为我的版本修复此问题;在 npm v5.3.0 中,我从链接到另一个项目的 repo 中删除了 node_modules

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

【讨论】:

【参考方案8】:

对我来说,这发生在我将本地软件包的版本号从 0.1.0 降低到 0.0.1 时。在我链接到这个包的项目中,我仍然使用更高的版本号。更新 package.json 中的依赖项修复了它。

【讨论】:

【参考方案9】:

检查 tsconfig moduleResolution

如果你和我一样,碰巧将 tsconfig modulees5 更改为 esnext 什么的,那么 moduleResolution 的默认值可能已经改变了。

如果没有将moduleResolution 设置为“node”,typescript 将不会解析 node_modules 包。

您可以在Compiler Options 页面上阅读有关默认值如何取决于module 的值,而module 的默认值又取决于target — 但可能会将其显式设置为“节点”。

【讨论】:

【参考方案10】:

我遇到了类似的问题,我必须执行以下步骤来解决它:

图书馆中

    package.json 中将产生问题的库设置为peerDependencies,而不是dependenciesdevDependencies,例如在我的情况下react
"peerDependencies": 
  "react": "^16.8.6",
  ...

    运行npm install 构建库(在我的例子中,使用rollup -c npm 脚本)

在我的主应用中

    更改我的库版本以指向我的本地项目,并在package.json 中使用相对路径,例如
"dependencies": 
  "my-library": "file:../../libraries/my-library",
  ...

    resolve.symlinks = false 添加到我的主应用的 webpack 配置中

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

    运行npm install 运行npm run start

【讨论】:

【参考方案11】:

一定要检查package.json中的main

这是您包裹的入口。这是一个小细节,我花了很长时间。

【讨论】:

【参考方案12】:

可能微不足道,但值得一提:

npm link <module-name> 必须在npm install(如果需要)在<module-name> 文件夹中执行之后执行

也就是说,除非链接模块已经存在于<module-name>文件夹的package.json中,在这种情况下顺序无关紧要,因为这意味着链接模块实际上是由npm install单独安装的(如图所示here),并且不需要使用 npm link 进行链接 - 这不是本问题的主题。

原因是npm link <module-name> 只是为链接的包创建一个符号链接(或文件夹快捷方式,在 Windows 中),因此之后执行 npm install 只是将其删除。

总而言之,这是执行顺序:

将 OP aligator 替换为 exporteraligator-methods 替换为 importer 以便于掌握
⚡  cd exporter
⚡  npm install <-- if needed, execute here, though it can also be executed after `npm link`
⚡  npm link
⚡  cd importer
⚡  npm install <-- if needed, must be executed here
⚡  npm link exporter
奖励:导出器和导入器的完整最小 ES 模块示例可以在 here 找到。

【讨论】:

【参考方案13】:

我知道这是一篇旧帖子,但就我而言,问题是我重命名了我的包目录名称,但 package.json“名称”仍设置为旧名称。

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

运行yarn link 将创建一个名为“package-name-b”的链接。

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

【讨论】:

【参考方案14】:

使用 peerDependency 时

我正在开发两个包,stejsstejs-loaderstejs-loader 具有 stejs 作为 peerDependency。当我在我的项目中运行npm link stejs-loadernpm link stejs 时,我遇到了stejs-loader 找不到stejs 的错误。我通过在stejs-loader 的目录中运行npm link stejs 来修复它。

【讨论】:

以上是关于NPM:找不到“npm link”模块后的主要内容,如果未能解决你的问题,请参考以下文章

Vue Cli:npm install 后找不到模块“../package.json”错误

在 npm 更新 v5.4.2 后找不到 ./node_modules/react-router-dom 模块中的错误

安装后找不到异步

通过 npm 安装后找不到 yarn 命令

在 zsh 中安装 npm 后找不到命令

节点。 npm install 后找不到 gulp