如何使用npm来安装在Node应用程序中甚至没有使用的全局包?

我对npm了解是这样的:

它是Node.js应用程序的包pipe理器。 这意味着,当你需要别人的节点应用程序的库/包时,你可以方便地使用npm来获得这些依赖关系。

但我最近碰到这个命令:

npm install -g cca

然后我在terminal上inputcca ,现在启动了一些程序。

现在我的问题是npm如何安装可以通过terminal访问的软件包? 我的意思是所有由npm安装的软件包应该可以通过节点应用程序代码访问(在JavaScript中)。 这使我困惑。

听起来像你的主要问题不是如何 ,但为什么

这里的区别是节点与节点模块之间的区别。

只有*模块*被其他节点应用程序require() ,并不是所有npm 软件包都需要模块 。 有很多有用的节点包只与节点间接相关。 例如, gulpgruntcordovacca

这些答案直接从npm常见问题解答(重写)

对于具体的cca ,我们希望将来有一个节点模块 ,所以“为什么npm”只是前瞻性思考的问题。 另外, ccacordova的下游发行版(就像phonegap一样),它总是在npm托pipe,我们想要继续传承下去。

npm install是一个复杂的命令 – 它至less有三个主要function:

  1. 从Node包(也就是包含package.json文件的目录或其子目录)的内部,运行npm install会安装所有该包声明的依赖关系。 它将这些下载的软件包node_modulesnode_modules目录中,并且它们都可以通过应用程序的JavaScript代码获得。

  2. 同样,从节点包内运行npm install <package-name>将从npm包存储库下载并安装一个命名包。 它将再次放置在node_modules目录中,以便该应用程序可用。

  3. 从任何地方运行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 prefixnpm prefix -g来查询它的值。
Unix系统上的默认 Node.js安装安装到共享位置,因此全局安装包需要root权限(通过sudo )。
相比之下,如果您使用的是基于Unix的多版本pipe理器,例如nnvm ,则{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.cmdbatch file代替符号链接,它们直接放置在{prefix} (在安装期间添加到%PATH% )。 这些batch file是基于分析给定的可执行文件而创build的,并通过在那里find的解释器显式调用它,从而实现无缝的跨平台体验。
  • 如果定义了软件包的man ,则将其链接到{prefix}/share/man ,例如/usr/local/share/man

    • Windowsman页根本没有安装。

另见http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/

-g选项使其成为提供全局命令的“全局”包。 这些用于构buildpipe理器(例如grup)的模块。 这些是在多个项目中以相同方式使用的模块,因此它们是“全局”模块。

我不知道为什么他们会用c的-g选项,因为cca似乎给了你项目特定的function,而不是项目pipe理。