运行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?
安装软件包有两种方法: globally
和locally
。
本地安装的软件包文件最终在您本地的node_modules
(在您的项目文件夹中,您称为npm install some-package
)。
全局安装的软件包文件最终在你的系统中,所以它们在命令行中可用,如果全局安装的软件包提供可执行文件,那么你可以在命令行中直接调用它some-package
(没有node
),如果它不提供可执行文件,那么你可以使用它在repl模式( node
)就像var package = require('some-package')
,它也是本地可用的(即使你没有在本地安装它,也在你的项目文件夹中)。
这开始作为一个评论,但现在得到了一点点。
问题不是完全找不到全局包的node
, node
只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”来执行同一个文件。