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

我正在为 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

但也没成功。

你知道会发生什么吗?我在某个地方读到过,这可能和我安装的 节点Npm有关,因为它是家酿的,所以有时我需要使用 sudo,这似乎不太可能,但我尝试了他们的建议,它也没有工作。

109079 次浏览

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

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

$cd ~/aligator-method
$npm install. ./aligator

对于我来说,当我将本地包的 减少版本号从0.1.0提升到0.0.1时,就会发生这种情况。在我链接到这个软件包的项目中,我仍然使用较高的版本号。更新 package.json中的依赖项修复了它。

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

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

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

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

对我有效的方法是:

  1. 在依赖项和使用者模块中删除 node_modules
  2. 运行 npm unlink --no-save [dependency-module]
  3. 根据 Npm-链接,使用2-link 命令重新链接

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

此外,还有一个 npm pack 命令,它可以帮助您测试未发布的模块,尽管不是很健壮。

Npm-pack

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

问题是 package.jsonmain属性指向一个不存在的文件。似乎这个问题可能由于多种原因而发生,所以一定要看看其他的答案。

使用 peerDependency 时

我正在开发两个软件包 stejsstejs-loaderstejs-loaderstejs作为 peerDependency。当我在我的项目中运行 npm link stejs-loadernpm link stejs时,我得到了一个 stejs-loader无法找到 stejs的错误。我通过在 stejs-loader的目录中运行 npm link stejs修复了这个问题。

检查 tsconfig 模块的分辨率

如果您像我一样,碰巧将 tsconfig modulees5更改为 esnext或其他更改,那么 moduleResolution默认值可能已经更改。

如果没有将 moduleResolution设置为“ node”,类型脚本将无法解析 node _ module 包。

您可以在 编译器选项页面上读到默认值如何取决于 module的值,而 module的默认值又取决于 targetーー但可能会显式地将其设置为“ node”。

我也遇到过类似的问题,为了解决这个问题,我必须执行以下步骤:

在图书馆 :

  1. 设置在 package.json中以 peerDependencies而不是 dependenciesdevDependencies生成问题的库,例如在我的案例中 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

也许微不足道,但值得一提的是:

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

  • 也就是说,除非链接的模块已经存在于 <module-name>文件夹的 package.json中,在这种情况下顺序并不重要,因为这意味着链接的模块实际上是由 npm install单独安装的(如已演示的 给你) ,并且没有必要使用 npm link进行链接——这不是这个问题的主题。

原因是 npm link <module-name>只是创建了一个指向链接包的符号链接(或 Windows 中的文件夹快捷方式) ,这样执行 npm install之后就会删除它。

总而言之,执行顺序如下:

  • exporter代替 OP aligator,用 importer代替 aligator-methods,更容易掌握
⚡  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 模块例子的出口商和进口商可以找到 给你

一定要检查 package.json中的 main

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

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

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

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

然后,我尝试运行 yarn link package-name,因为我使用的是目录名。当我换到 yarn link package-name-b的时候,成功了。

我在本地包(依赖项)上运行 npm run build,这对我很有用

我无法从我的链接包中导入,因为我只是忘记在顶级 index.ts文件中为模块导出预先设置 ./:

export * from './utilities'

花了点时间才想明白。