运行 npm 全局安装的包

问题描述 投票:0回答:5

有人可以解释一下节点的全局安装行为如何吗?这真的让我很困惑。如果我全局安装一个包(带有可执行文件),例如

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
运行它,因此会损坏。为什么会发生这种情况?为什么node找不到自己模块的路径?

javascript node.js emacs npm
5个回答
8
投票

安装包有两种方式:

globally
locally

本地安装的包文件最终位于本地

node_modules
(在您调用
npm install some-package
的项目文件夹中)。

全局安装的软件包文件最终会出现在您的系统中,因此它们可以在命令行中使用:

  • 如果全局安装的软件包提供了可执行文件,那么您可以直接使用
    some-package
    (不带
    node
    )在命令行中调用它
  • 如果全局安装的软件包不提供可执行文件,那么您可以使用
    node
    在 repl 模式下使用它(
    var package = require('some-package')
    );这将使其在您的项目中本地可用,即使您没有在本地安装它。

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

您的文件将被执行


3
投票

这开始是一条评论,但现在变得更长了。

问题并不完全是

node
找不到全局包,
node
只搜索当前位置的包(就像在
node_modules
下),这是设计使然。全局安装的软件包可以通过命令运行,就像因为
npm
安装它们的方式一样,这就是全局软件包在某种程度上的特殊之处。

在基于 Unix 的系统上,npm 创建指向全局安装包的主要可执行文件的软链接,例如可执行路径中文件夹中的

http-server
。在我的机器上,这是
/usr/local/bin/
。这就是为什么可以从命令行调用这些命令而无需指定完整路径。

在 Windows 上,npm 在

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


0
投票

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


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 
© www.soinside.com 2019 - 2024. All rights reserved.