运行npm全局安装的软件包

有人可以请解释节点的全局安装行为。 这真让我困惑。 如果我安装一个包(可执行文件),如全球http-server我可以运行它:

 http-server 

但是,如果我这样做

 node http-server 

我明白了

 module.js:339 throw err; ^ Error: Cannot find module '/path/to/current/dir/http-server' at Function.Module._resolveFilename (module.js:337:15) at Function.Module._load (module.js:287:25) at Function.Module.runMain (module.js:457:10) at startup (node.js:136:18) at node.js:972:3 

我怀疑在emacs我的tern包正试图运行它,因此node因此打破。 为什么发生这种情况? 为什么不能find自己模块的path?

安装软件包有两种方法: globallylocally
本地安装的软件包文件最终在您本地的node_modules (在您的项目文件夹中,您称为npm install some-package )。
全局安装的软件包文件最终在你的系统中,所以它们在命令行中可用,如果全局安装的软件包提供可执行文件,那么你可以在命令行中直接调用它some-package (没有node ),如果它不提供可执行文件,那么你可以使用它在repl模式( node )就像var package = require('some-package') ,它也是本地可用的(即使你没有在本地安装它,也在你的项目文件夹中)。

这开始作为一个评论,但现在得到了一点点。

问题不是完全找不到全局包的nodenode只search当前位置的包(就像在node_modules下),这是由devise决定的。 全局安装的软件包可以像npm安装的那样从命令中运行,这就是全局软件包在某些方面的特殊之处。

在基于Unix的系统上,npm创build到全局安装包的主要可执行文件的软链接,例如可执行文件夹中的http-server 。 在我的机器上,这是/usr/local/bin/ 。 这就是为什么可以从命令行调用这些命令而不指定完整path的原因。

在Windows上,npm创build一个可执行batch file,命名为%APPDATA%下的实例http-server.cmd (通常类似于C:\Users\YourUserName\AppData\Roaming )。 batch file包含从目标实际安装位​​置运行目标可执行文件的指令。

 rahul@Rahul-Machine:~$ node blalal module.js:338 throw err; ^ Error: Cannot find module '/home/rahul/blalal' at Function.Module._resolveFilename (module.js:336:15) at Function.Module._load (module.js:286:25) at Function.Module.runMain (module.js:475:10) at startup (node.js:117:18) at node.js:951:3 

哦同样的错误

这是因为我第一次命令你实际上是试图访问一个全局variables,但是第二次你是在你的文件层次结构中的某个地方,从那里你说你想访问这个包,所以如果你想要执行全局variables包试试

 whereis http-server 

然后进入该目录并find文件package.json,然后打开它并find“main”属性,在那里你得到一个文件名,然后键入

  node index.js 

你的文件将被执行

当你在全局安装某些东西的时候,你需要存储一个链接到它的存储path的variables以及执行程序。 而您的操作系统将知道如何访问它。 节点不会。 如果你想“节点something.js”,你要么在目录,要么调整你的path,以便节点知道如何到达文件。 例如节点“c:/jsapps/main/app.js”,或者如果你在说让文件夹“jsapps”,你可以input节点“main / app.js”来执行同一个文件。