我正在尝试在Mac OSX Lion上设置Node。这一切似乎都运行正常,但我似乎无法从我的全局模块文件夹导入任何模块。我收到了错误,
Error: Cannot find module <module>
如果我运行:node -e require.paths
,我得到的回复是:
[ '/usr/local/lib/node_modules',
'/Users/Me/.node_modules',
'/Users/Me/.node_libraries',
'/usr/local/Cellar/node/0.4.12/lib/node' ]
哪个是正确的,我的模块确实安装在/ usr / local / lib / node_modules中。但是,当我尝试运行脚本时,我得到了这个:
Error: Cannot find module 'socket.io'
at Function._resolveFilename (module.js:326:11)
at Function._load (module.js:271:25)
at require (module.js:355:19)
at Object.<anonymous> (/Users/Me/node/server.js:2:10)
at Module._compile (module.js:411:26)
at Object..js (module.js:417:10)
at Module.load (module.js:343:31)
at Function._load (module.js:302:12)
at Array.<anonymous> (module.js:430:10)
at EventEmitter._tickCallback (node.js:126:26)
我的.bash_profile看起来像这样:
export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"
非常感谢一些帮助,我不知道为什么我不能导入任何库。
答案 0 :(得分:99)
如果您使用的是npm&gt; = 1.0,则可以使用npm link <global-package>
创建指向已全局安装的软件包的本地链接。 (警告:操作系统必须支持符号链接。)
然而,这并非没有问题。
npm link是一个开发工具。用于管理本地开发盒上的包是 awesome 。但是使用npm链接部署基本上是在寻找问题,因为它使得在没有意识到的情况下更新事物非常容易。
作为替代方案,您可以在本地以及全局安装软件包。
有关其他信息,请参阅
答案 1 :(得分:58)
您可以使用npm链接在项目文件夹中创建指向全局包的符号链接。
示例:
$ npm install -g express
$ cd [local path]/project
$ npm link express
它所做的只是创建一个本地node_modules文件夹,然后创建一个符号链接express - &gt; [global directory] / node_modules / express,然后可以通过require('express')
答案 2 :(得分:51)
Node.js使用环境变量NODE_PATH
来指定要包含在模块搜索路径中的其他目录。您可以使用npm
本身通过npm root -g
命令告诉您存储全局模块的位置。因此,将这两者放在一起,您可以使用以下命令确保全局模块包含在搜索路径中(在Linux-ish上)
export NODE_PATH=$(npm root --quiet -g)
答案 3 :(得分:19)
全局安装任何包,如下所示:
$ npm install -g replace // replace is one of the node module.
由于此替换模块是全局安装的,因此如果您看到节点模块文件夹,则不会在那里看到替换模块,因此您无法使用require(&#39; replace&#39;)来使用此软件包。
因为使用require,您只能使用节点模块文件夹中存在的本地模块。
现在使用全局模块,您应该使用以下命令将其与节点模块路径链接。
$ npm link replace
现在返回查看您的节点模块文件夹,您现在可以在那里看到替换模块,并且可以在应用程序中使用require(&#39; replace&#39;),因为它与本地节点模块链接
请告诉我是否需要进一步澄清。
答案 4 :(得分:9)
您可以将require与全局模块目录的路径一起用作参数。
resignFirstresponder
在我的Mac上,我用这个:
textfield
如何查找全局模块的位置? - &GT; Where does npm install packages?
答案 5 :(得分:1)
将环境变量NODE_PATH设置为指向全局node_modules
文件夹。
在Windows 7或更高版本中,路径类似于%AppData%\npm\node_modules
,而在UNIX中可能类似/home/sg/.npm_global/lib/node_modules/
,但它取决于用户配置。
命令npm config get prefix
可以帮助找出哪条路径是正确的。
在UNIX系统中,您可以使用以下命令完成它:
export NODE_PATH=`npm config get prefix`/lib/node_modules/
答案 6 :(得分:0)
我正在使用Docker。我正在尝试创建一个已安装所有节点依赖项的docker镜像,但可以在容器运行时使用我的本地app目录(不会使用node_modules目录或链接进行污染)。这会导致此方案出现问题。我的解决方法是要求从模块的确切路径,例如,要求( '的/ usr /本地/ LIB / node_modules / socket.io')
答案 7 :(得分:0)
简单的答案是在 npm 全局根目录中运行 node。
cd $( npm root -g ) && node
答案 8 :(得分:-2)
require.paths
已被弃用。
转到项目文件夹并输入
npm install socket.io
应将其安装在节点将查找的本地./node_modules文件夹中。
我保留这样的话:
cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io
创建app.js文件
// app.js
var socket = require('socket.io')
现在运行我的应用
node app.js
确保您使用的是npm >= 1.0
和node >= 4.0
。