【问题标题】:Running npm globally installed packages运行 npm 全局安装的包
【发布时间】:2020-11-17 15:34:06
【问题描述】:

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

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 中的ternpackage 试图用node 运行它,因此会中断。为什么会这样?为什么节点找不到自己模块的路径?

【问题讨论】:

    标签: javascript node.js emacs npm


    【解决方案1】:

    有两种安装包的方法:globally 和 locally。
    本地安装的包文件最终位于您的本地 node_modules(在您调用 @987654324 的项目文件夹中@).
    全局安装的包文件最终会在您的系统中,因此它们可以在命令行中使用,如果全局安装的包提供可执行文件,那么您可以直接在命令行中调用它some-package(无需node),如果它不提供可执行文件,那么您可以在 repl 模式 (node) 中使用它,例如 var package = require('some-package'),它也可以在本地使用(即使您没有在本地安装它,也可以在您的项目文件夹中使用) .

    【讨论】:

      【解决方案2】:

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

      问题不完全是node 没有找到全局包,node 只搜索当前位置的包(比如在node_modules 下),这是设计使然。由于npm 安装它们的方式,全局安装的包可以从命令运行,这就是全局包在某些方面的特殊之处。

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

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

      【讨论】:

      • 但为什么我不能用node [package-name] 运行它们?一些包(emacs 包)尝试使用 node 前缀运行这些包,这是令人困惑的部分
      • @Arijoon 可能是因为这些包希望找到本地安装的依赖项。
      • 好的,我怎样才能确保他们在全球范围内找到他们的依赖关系?因为如果我什至在本地安装相同的包,它仍然无法使用node [package-name]
      【解决方案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
      

      你的文件将被执行

      【讨论】:

        【解决方案4】:

        如果您尚未全局安装 npm node 模块,此答案将帮助您在命令行上运行它。 要么按照您的方式在全球范围内运行它。 其他选项是提供本地包文件的完整路径。例如,我想运行一个包 live-server,它作为包本地安装在我当前的目录中。

        node ./node_modules/live-server/live-server --port=5000 
        

        这里(在我的 Mac 上)live-server.js 文件位于 live-server 目录中,添加 .js 并执行如下命令是可选的。端口也是 live-server 的可选参数

        node ./node_modules/live-server/live-server.js --port=5000 
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2021-04-13
            • 1970-01-01
            • 1970-01-01
            • 2017-11-05
            • 2020-10-23
            • 1970-01-01
            • 2023-04-03
            • 2019-12-22
            • 2019-06-26
            相关资源
            最近更新 更多