正在运行npm全局安装的程序包
Running npm globally installed packages
有人能解释一下全局安装的节点的行为吗。这真的让我很困惑。如果我全局安装一个包(带有可执行文件),比如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
运行它,因此中断了。为什么会发生这种情况?为什么节点找不到自己模块的路径?
有两种安装包的方法:globally
和locally
本地安装的程序包文件最终位于本地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"来执行同一个文件。
- 有没有一种方法可以从Javascript检测特定的应用程序是否安装在(AndroidiOS)设备上
- 列出谷歌浏览器中安装的所有扩展程序
- 在安装后首次运行应用程序时从 UIBebView 发出 jQuery Ajax 请求
- 安装后以程序方式关注形状元素
- 客户端GWT和Maven好奇的安装程序
- 如何让我的ember.js应用程序导入从bower或npm安装的模块
- 为什么removeEventListener不适用于React安装的事件处理程序
- 如果从我的网站在浏览器中安装了其他程序,如何在移动应用程序中打开共享对话框
- Chrome扩展应用程序在安装后不会显示徽标图像
- Angular应用程序无法安装,原因是出现错误:[$injector:modulerr]
- 当应用程序没有安装时,如何将用户重定向到(android,ios)市场
- 用于安装 Google Chrome 扩展程序的 HTML 代码 (.crx)
- 将 ScrollMagic 安装到 Sails.js 生成的 Web 应用程序中
- 理论上是否有可能使用 chromium 的可安装网络应用程序 API 构建纯 JS bittorrent
- Chrome 扩展程序安装
- 如何在启动应用程序之前强制网络驱动程序安装应用程序
- MongoDB的Node.js驱动程序安装失败
- 是否有可能告诉如果覆盖新标签页被打开,因为一个应用程序安装
- 反应原生领域:应用程序安装/更新时的初始数据
- 访问应用程序安装目录