如何使用npm来安装在Node应用程序中甚至没有使用的全局包?
我对npm
了解是这样的:
它是Node.js
应用程序的包pipe理器。 这意味着,当你需要别人的节点应用程序的库/包时,你可以方便地使用npm
来获得这些依赖关系。
但我最近碰到这个命令:
npm install -g cca
。
然后我在terminal上inputcca
,现在启动了一些程序。
现在我的问题是npm
如何安装可以通过terminal访问的软件包? 我的意思是所有由npm
安装的软件包应该可以通过节点应用程序代码访问(在JavaScript中)。 这使我困惑。
听起来像你的主要问题不是如何 ,但为什么 ?
这里的区别是节点包与节点模块之间的区别。
只有*模块*被其他节点应用程序require()
,并不是所有npm
软件包都需要模块 。 有很多有用的节点包只与节点间接相关。 例如, gulp
或grunt
或cordova
或cca
等
这些答案直接从npm常见问题解答(重写)
对于具体的cca
,我们希望将来有一个节点模块 ,所以“为什么npm”只是前瞻性思考的问题。 另外, cca
是cordova
的下游发行版(就像phonegap
一样),它总是在npm
托pipe,我们想要继续传承下去。
npm install
是一个复杂的命令 – 它至less有三个主要function:
-
从Node包(也就是包含
package.json
文件的目录或其子目录)的内部,运行npm install
会安装所有该包声明的依赖关系。 它将这些下载的软件包node_modules
在node_modules
目录中,并且它们都可以通过应用程序的JavaScript代码获得。 -
同样,从节点包内运行
npm install <package-name>
将从npm包存储库下载并安装一个命名包。 它将再次放置在node_modules
目录中,以便该应用程序可用。 -
从任何地方运行
npm install -g <package-name>
将全局下载并安装一个命名包。 这意味着它将被安装到系统的node_modules目录中,并可供所有节点程序包使用。
使用-g的第三个用法也用于命令行工具(而不是库)。 使用-g进行安装时,软件包可以执行诸如在/ usr / local / bin中安装新命令或安装手册页等操作。 这些命令然后可以从一个shell运行。
这是cca
在安装时所做的,也是我们推荐使用-g
安装的原因。 以便您可以使用cca
命令从任何位置创build应用程序,而不是因为它是一种打包实用程序。
- 查看@ mmocny的答案 为什么
cca
是(全局)npm
包 ,尽pipe不包含用于JavaScript代码的模块。 - 这个答案显示了全局
npm
包的工作方式 。
全局安装的npm软件包(带-g
)通常包含可执行文件 (无论是否是二进制文件 ),这些文件将被添加到预期位于系统$PATH
中的文件夹中,以便使它们在您的shell中全局可用(从命令行) – 独立于Node.js。
由于npm help folder
简洁地(强调我的):
- 如果你打算
require()
它在本地安装。- 如果要在命令行上运行它,请 全局安装它。
全局程序包安装大致如下所示 :
注意:根据平台(例如Linux上的/usr
),目录{prefix}
代表的目录不同 – 您可以使用npm get prefix
或npm prefix -g
来查询它的值。
Unix系统上的默认 Node.js安装安装到共享位置,因此全局安装包需要root权限(通过sudo
)。
相比之下,如果您使用的是基于Unix的多版本pipe理器,例如n
或nvm
,则{prefix}
可能是用户特定的目录,例如~
或~/.nvm/v0.10.28
,这样就不需要root权限用于全局安装软件包。
下面的描述是基于Unix平台的,在Windows上有不同的行为,分别在需要的地方注明。
-
全局程序包安装在
{prefix}/lib/node_modules
的特定于软件包的子文件夹中,例如/usr/local/lib/node_modules
。 -
然后在
{prefix}/bin
创build符号链接到程序包的bin
子文件夹中的可执行文件(通常;在程序包的package.json
文件的"bin"
属性中定义),例如usr/local/bin
– 这就是它们全局可用,假设{prefix}/bin
被假定为在$PATH
。- Windows :
.cmd
batch file代替符号链接,它们直接放置在{prefix}
(在安装期间添加到%PATH%
)。 这些batch file是基于分析给定的可执行文件而创build的,并通过在那里find的解释器显式调用它,从而实现无缝的跨平台体验。
- Windows :
-
如果定义了软件包的
man
页 ,则将其链接到{prefix}/share/man
,例如/usr/local/share/man
- Windows :
man
页根本没有安装。
- Windows :
另见http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/
-g选项使其成为提供全局命令的“全局”包。 这些用于构buildpipe理器(例如grup)的模块。 这些是在多个项目中以相同方式使用的模块,因此它们是“全局”模块。
我不知道为什么他们会用c的-g选项,因为cca似乎给了你项目特定的function,而不是项目pipe理。