有人可以解释一下节点全局安装的行为方式。这让我很困惑。如果我在全球范围内安装一个包(带有可执行文件),例如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
我怀疑tern
中的emacs
个套件正试图以node
运行它,因此破坏了。为什么会这样?为什么节点无法找到自己模块的路径?
答案 0 :(得分:3)
安装软件包的方法有两种:globally
和locally
本地安装的软件包文件最终会出现在您的本地node_modules
中(在您调用npm install some-package
的项目文件夹中)。
全局安装的软件包文件最终在您的系统中,因此它们在命令行中可用,如果全局安装的软件包提供可执行文件,那么您可以直接在命令行中调用它some-package
(不node
}),如果它不提供可执行文件,那么你可以在repl模式(node
)中使用它,如var package = require('some-package')
,它也可以在本地使用(即使你没有安装它也在你的项目文件夹中)局部地)。
答案 1 :(得分:3)
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
同样的错误
这是因为我第一次命令你实际上是在尝试访问一个全局变量,但是在第二个命令中,你是文件层次结构中的某个位置,并且从那里你说你想要访问该包,所以如果你想要你错了执行该全局包尝试
whereis http-server
然后转到该目录并找到文件package.json,然后打开它并找到" main"属性,然后你得到一个文件名,然后输入
node index.js
您的文件将被执行
答案 2 :(得分:2)
这开始是一个评论,但现在变得更长了。
问题并非node
找不到全局包,node
只搜索当前位置的包(例如node_modules
下),这是设计使然。可以从命令运行全局安装的包,就像npm
安装它们的方式一样,这就是使得全局包在某种程度上特殊的原因。
在基于Unix的系统上,npm创建指向全局安装包的主要可执行文件的软链接,例如可执行路径中的文件夹中的http-server
。在我的机器上,这是/usr/local/bin/
。这就是为什么可以从命令行调用这些命令而不指定完整路径的原因。
在Windows上,npm在http-server.cmd
下创建一个名为%APPDATA%
的可执行批处理文件(通常类似于C:\Users\YourUserName\AppData\Roaming
)。批处理文件包含从实际安装目标可执行文件的位置运行目标可执行文件的说明。
答案 3 :(得分:0)
当您在全局安装某些内容时,您将存储一个变量,其中存储的路径链接到该变量以及执行程序。虽然您的操作系统将知道如何访问它。节点不会。如果你想“节点something.js”,你可以在它的目录中或调整你的路径,以便节点知道如何到达该文件。例如节点“c:/jsapps/main/app.js”或者如果你在文件夹'jsapps'中你可以输入节点“main / app.js”执行相同的文件。
答案 4 :(得分:0)
如果您尚未全局安装npm节点模块,则此答案将帮助您在命令行上运行它。 您可以按照自己的方式全局运行它。 另一种选择是提供本地软件包文件的完整路径。例如,我要运行一个软件包实时服务器,该服务器作为软件包本地安装在当前目录中。
node ./node_modules/live-server/live-server --port=5000
在我的Mac上,live-server.js文件位于live-server目录中,它是添加.js并执行以下命令的可选操作。端口是实时服务器的可选参数
node ./node_modules/live-server/live-server.js --port=5000