是否必须全局安装 NPM 包才能通过命令行访问其功能?

Do NPM packages have to be installed globally to access their functionality via the command line?

我无法理解 -g 标志在 NPM 中的工作原理。具体来说,我正在努力理解它与 NPM 模块公开的命令行功能的关系。

我假设在本地和全局安装包之间的区别只是本地包在特定项目之外不可用。当然,任何项目都可以使用全局安装的包。我来自 Rails 背景,所以这对我来说类似于将 gem 安装到特定 RVM 而不是将其安装到全局 RVM。它只会影响它可用的地方。

然而,在 NPM 中似乎不仅仅是作用域更重要。对于具有命令行功能的包,如 wait-on,包(据我所知)在命令行上不可用,除非它是全局安装的。

本地安装不提供命令行功能:

$ npm install wait-on
$ wait-on
=> -bash: /usr/local/bin/wait-on: No such file or directory

全局安装确实公开了命令行功能

$ npm install wait-on -g 
$ wait-on
=> Usage: wait-on {OPTIONS} resource [...resource]

   Description:

     wait-on is a command line utility which will wait for files, ports,
     sockets, and http(s) resources to become available (or not available
     using reverse flag). Exits with  success code (0) when all resources
     are ready. Non-zero exit code if interrupted or timed out.

     Options may also be specified in a config file (js or json). For
     example --config configFile.js would result in configFile.js being
     required and the resulting object will be merged with any

您可以使用本地安装公开命令行功能吗?

是否可以在本地安装的同时获得命令行功能?这对我的 CI 设置非常有帮助,因为缓存本地模块比全局模块容易得多,所以我更愿意在本地安装。

本地安装使包可用于当前项目(它将所有节点模块存储在 node_modules 中)。这通常只适用于使用像这样的模块 var module = require('module'); 或导入模块。

它将无法作为 shell 可以解析的命令使用,直到您全局安装它 npm install -g 模块,npm 会将其安装在您的路径变量将解析此命令的位置。

你可以找到一个相当不错的解释here

将命令放在 package.json 的脚本块中也很有用,因为它会自动解析本地命令。这意味着您可以拥有一个依赖于某个包的脚本,而不会对其具有未记录的依赖性。

如果你需要 运行 在 cmd 本地,你必须从路径进入 node_modules 和 运行。

如果您使用的是 npm 5.2.0 或更高版本,则默认包含 npx 命令。它将允许您从本地节点模块运行:npx wait-on

供参考:https://www.npmjs.com/package/npx

我认为只有将它们添加到 package.json 的 "scripts" 部分,才能从命令行访问本地安装的模块。因此,要使用本地安装的等待版本,您可以在 package.json 的 "scripts" 部分添加一个条目,例如 "wait-on": "wait-on"。然后到 运行 它,你将不得不做 npm 运行 等待。您还可以执行 "wo": "wait-on" 然后执行 npm 运行 wo 基本上意味着 运行 之后的内容是脚本条目。在node_modules中有一个.bin文件夹,这个文件夹里面是你可以通过这种方式访问​​的所有可执行文件。