正在运行npm全局安装的程序包

Running npm globally installed packages

本文关键字:程序 安装 全局 运行 npm      更新时间:2023-09-26

有人能解释一下全局安装的节点的行为吗。这真的让我很困惑。如果我全局安装一个包(带有可执行文件),比如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运行它,因此中断了。为什么会发生这种情况?为什么节点找不到自己模块的路径?

有两种安装包的方法:globallylocally
本地安装的程序包文件最终位于本地node_modules中(位于您调用npm install some-package的项目文件夹中)
全局已安装的程序包文件最终会出现在您的系统中,因此它们在命令行中可用,如果全局已安装的软件包提供可执行文件,则您可以直接在命令行some-package(不带node)中调用它,如果它不提供可执行文件,那么您可以像var package = require('some-package')一样在repl模式(node)中使用它,而且它也可以在本地使用(即使您没有在本地安装它,也可以在项目文件夹中使用)。

这开始只是一个注释,但现在有点长了。

问题并不完全是node找不到全局包,node只搜索当前位置的包(如node_modules下的包),这是故意的。全局安装的软件包可以像npm那样通过命令运行,这在某种程度上使全局软件包与众不同。

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

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

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

ooh相同错误

这是因为我第一次命令你实际上是在尝试访问一个全局变量,但第二次命令你在文件层次结构中的某个位置,然后你说你想访问该包,所以如果你想执行该全局包,你就错了,试试

whereis http-server

然后转到该目录,找到文件package.json,然后打开它,找到"main"属性,在那里你会得到一个文件名,然后键入

  node index.js

您的文件将被执行

如果您还没有全局安装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 

当您全局安装某个东西时,您会存储一个变量,其中存储的路径链接到该变量以及执行程序。而你的操作系统会知道如何访问它。Node不会。如果你想"nodesomething.js",你要么在它所在的目录中,要么调整你的路径,让节点知道如何访问文件。例如node"c:''/jsapps/main/app.js",或者如果你在文件夹"jsapps"中,你会键入node"main/app.js"来执行同一个文件。