npm link 和 peerDependencies 的问题

我的项目需要调试某个框架的 plug-in,举例来说, graph-compose-connectiongraph-compose 框架的一个 plug-in,因此我在我的项目中(例如: my-project)对 graph-compose-connection 使用了 npm link,这样我就可以通过随时修改 graph-compose-connection 的代码来调试。

graph-compose-connection 项目中 peerDependencies 了其宿主 graph-compose,这是很常见的做法,可以让 plug-in 和宿主的依赖不那么严苛。但是这样问题就来了,当执行 my-project 下的代码时,总是会报出找不到 graph-compose 的异常,尽管在 my-project 中已经依赖并安装了 graph-compose

这个问题的原因在于,Node.JS 模块系统在搜寻依赖模块时,是从当前模块的 node_modules 开始搜索,没找到就去查找父目录的 node_modules,一路向上。但是对于 npm linkgraph-compose-connection,因为是符号链接过去的,其父目录并非是 my-project,于是就找不到了。

这个问题很早就出现过,然后修复了。但是在 Node.JS v6 又出现了(由于 require 算法的改变),后来经过讨论,通过增加一个命令行参数来解决这个问题: --preserve-symlinks。因此你需要这样执行:

node  --preserve-symlinks index.js
# or coffee
coffee --nodejs --preserve-symlinks index.coffee

详情参见: https://github.com/nodejs/node/pull/6537

推荐阅读更多精彩内容