使用“npm link”时,Node.js require()不查看父目录

时间:2014-03-15 15:01:10

标签: node.js npm

我正在为node.js开发一个模块。对于开发我正在使用“npm link”,它基本上在驱动器上创建一个sym链接(我正在运行Ubuntu)到该模块的开发位置。

当我使用require加载父应用程序在其node_modules文件夹中的模块时,它没有被加载。我改为“找不到模块x”。我将环境变量NODE_DEBUG设置为module,发现它只是从驱动器上的物理位置“向上”,而不是从项目内部查找。

有没有人建议我如何解决这个问题?我现在的解决方案现在不幸地将模块代码物理复制到我的测试项目中,作为启动脚本的一部分,这并不酷!

就我个人而言,我认为这可能是一个错误,但我不确定它是否表现得如预期,我只是做错了。

3 个答案:

答案 0 :(得分:2)

这就是模块parent-require试图解决的问题。虽然如果核心需要自己处理它会更好。

答案 1 :(得分:2)

自你的帖子以来已经有一段时间了,但也许你或其他人仍然对这个问题的解决方案感兴趣,我也面临很长一段时间。

正如侧面评论一样,在节点v 6.x中,实际上已经实现了正确的行为,但由于副作用,它当前位于标志--preserve-symlinks之后。因此,即使使用此标志也可能会导致这些副作用,为什么它会从默认行为中删除。

在从node.js方面修复之前,您仍然可以使用以下workarround:

NODE_PATH设为./node_modules

例如,使用构建脚本中的browserify执行此操作:

"scripts": {
  "build:debug": "NODE_PATH=./node_modules browserify src/index.js > dist/build.js"
}

其中./node_modules是根应用程序目录中的node_modules文件夹,导致节点在该文件夹中搜索,如果在其他位置找不到该模块。

对于 Windows 用户,我建议安装cross-env模块以正确设置环境变量。然后构建脚本看起来像:

"scripts": {
  "build:debug": "cross-env NODE_PATH=./node_modules browserify src/index.js > dist/build.js"
}

这个工作范围最终解决了我之前遇到的与链接模式

中没有的对等依赖关系的问题

答案 2 :(得分:1)

我可以理解你是如何认为它在上下文中存在模块的位置&#34;,但不幸的是npm link <module>只是在node_modules下创建了一个正常的符号链接。从链接模块的上下文中,它不知道(并且无法合理地知道)它与其他目录的符号链接。

require行为很复杂,但实际上它通过node_modules目录的父目录查找,这是正确的行为。你遇到的问题是对等依赖的一般问题,有一些解决方案。您可以将所有项目放在Module Project目录

中,而不是链接到node_modules

peer dependencies

Node Project只需要Module Project,同样Module Project可以要求来自Node Project。如果它们彼此都需要,那么循环依赖可能会出现很大的问题,所以要小心。

如果您准确解释链接的Module Project正在寻找什么,可能会有所帮助。