我的项目需要调试某个框架的 plug-in,举例来说, graph-compose-connection
是 graph-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 link
的 graph-compose-connection
,因为是符号链接过去的,其父目录并非是 my-project
,于是就找不到了。
这个问题很早就出现过,然后修复了。但是在 Node.JS v6 又出现了(由于 require
算法的改变),后来经过讨论,通过增加一个命令行参数来解决这个问题: --preserve-symlinks
。因此你需要这样执行:
node --preserve-symlinks index.js
# or coffee
coffee --nodejs --preserve-symlinks index.coffee