如何使用npm管理Linux服务器上的Node.js包
介绍
Node.js 是用于服务器端编程的流行 Javascript 平台,可让您快速构建和运行 Web 应用程序。 在过去的指南中,我们讨论了 如何在 Ubuntu 14.04 服务器 上安装 Node.js。
在本指南中,我们将讨论如何使用 Node.js 包管理系统 npm
来管理服务器上的 Node.js 包。 使用此实用程序,您可以轻松满足应用程序依赖项、搜索包和管理安装。
我们假设您同时安装了 Node.js 和 npm
。 您可以按照上面的指南让这些在 Ubuntu 14.04 上运行。 我建议使用该教程中介绍的 nvm
方法。
如果您只是想快速入门,您还可以在 Ubuntu 14.04 的存储库中找到这些软件包并通过键入以下命令进行安装:
sudo apt-get update sudo apt-get install nodejs npm
熟悉 npm
现在您已经安装了必要的组件,我们可以开始了。
我们要做的第一件事是向我们的 shell 添加一些 npm
自动完成功能,方法是在我们的 shell 配置文件的底部添加一些信息。
您可以通过键入:
npm completion >> ~/.bashrc
现在,只需获取配置文件以重新读取您刚刚添加的新更改:
source ~/.bashrc
现在,npm 应该能够通过点击 [TAB]
键来自动完成它的命令。
为了让自己有方向感,最好的办法是熟悉 npm 提供的帮助功能。 要了解 npm 中可用的子命令,您可以键入:
npm help
Usage: npm <command> where <command> is one of: add-user, adduser, apihelp, author, bin, bugs, c, cache, completion, config, ddp, dedupe, deprecate, docs, edit, explore, faq, find, find-dupes, get, help, help-search, . . .
要简要了解这些子命令的含义,您可以键入:
npm -l
Usage: npm <command> where <command> is one of: adduser npm adduser Then enter stuff at the prompts bin npm bin npm bin -g (just prints the bin folder) . . .
通过使用以下格式,您可以更全面地了解这些命令:
npm 帮助子命令
这将为所需的子命令打开一个单独的手册页。
如果您不知道哪个命令涵盖了您希望执行的操作,您还可以使用以下内容在帮助主题中搜索:
npm 帮助搜索search_term
查找有关您的系统的信息
现在您已经设置并知道如何访问其内置帮助,我们可以进行探索。 让我们从学习如何询问与 npm 相关的系统信息开始。
在我们这样做之前,我们应该谈谈本地包和全局包之间的区别。
本地与全球套餐
创建 Node.js 应用程序时,您会创建一个目录结构来保存您的应用程序。 在项目目录中,将有一个名为 node_modules
的子目录。 这包含您可以为您的项目安装 locally 的所有模块。
让我们创建一个空目录结构,作为我们的包目录作为示例:
mkdir -p ~/projects/test_package/node_modules cd ~/projects/test_package
通过使用常规的 Javascript require()
方法,可以在您的项目中使用本地安装的模块。 这是您大部分时间都需要的包。
如果你需要使用一个包的命令行功能,你应该安装它globally。 全局安装的应用程序保存在 ~/.npm/
目录中。 它们的命令行功能将可用于所有 Node.js 应用程序。 但是,全局安装的包不能与 Javascript require()
一起使用。
知道了这一点,您可以看到我们将如何拥有与每种特定类型的包相关联的功能。 默认情况下,大多数 npm 命令将假定您正在谈论本地包,除非您传递 -g
或 --global
标志。
列出安装在我们系统上的软件包
现在您知道本地包和全局包之间的区别,我们可以继续。 因此,要列出 test_package
目录中可用的(本地安装的)Node.js 包,我们可以键入:
npm ls
/home/demouser/projects/test_package └── (empty)
由于我们还没有为我们的应用程序安装任何 Node.js 包,所以它显示为空。
但是,npm 会自动全局安装一些包。 让我们通过 -g
标志来查看:
npm ls -g
/home/demouser/.nvm/v0.11.13/lib └─┬ npm@1.4.9 ├── abbrev@1.0.4 ├── ansi@0.2.1 ├── ansicolors@0.3.2 ├── ansistyles@0.1.3 ├── archy@0.0.2 . . .
如您所见,有相当多的全局包。 它们以依赖树格式显示。
您可以使用其他一些选项来修改输出。 您可以使用 -l
或 -a
标志来获取更多信息。 您可以通过可选地传递 --json
标志以 JSON 格式查看此信息。
查询其他信息
除了简单地向 npm 询问已安装的包之外,我们还可以向它询问有关其环境的一些其他信息。
我们可以通过键入以下内容来查看 npm 所指的本地包层次结构中的根模块目录:
npm root
/home/demouser/projects/test_package/node_modules
您可以使用 prefix
子命令获取您正在处理的包的顶级路径:
npm prefix
/home/demouser/projects/test_package
这些也可以与 -g
标志一起使用,以查看全局文件的存储位置。
要查看 npm 将在何处安装可执行文件,您可以找到当前项目的 bin
目录:
npm bin
/home/demouser/projects/test_package/node_modules/.bin
探索包的文件
要快速转到安装包的目录位置,实际上只需使用 explore
子命令即可。 这将在安装包的目录中打开一个子shell。
例如,我们可以通过键入以下命令在安装 npm 本身的目录中打开一个子 shell:
npm explore -g npm
Exploring /home/demouser/.nvm/v0.11.13/lib/node_modules/npm Type 'exit' or ^D when finished
您可以操作或浏览此目录中的文件,然后退出子 shell 以返回到您之前所做的事情。
exit
使用 npm 作为包管理器
到目前为止,我们已经介绍了很多内容,但到目前为止,我们已经避开了 npm 的主要功能。 人们使用 npm 的主要原因是它的包管理功能。
搜索和安装包
当你需要一个 Node.js 包时,你可以使用 npm 搜索它。 假设我们的项目需要 express
包。 Express 是一个网络框架。
我们可以在 npm 包档案中搜索这个包,这些包位于 npm 网站 :
npm search express
这实际上会返回一个非常长的列表,因为 express 是一个非常受欢迎的包。 您可以将其通过管道传输到 less
之类的寻呼机中,以便更轻松地查看它。 我们还可以像这样使用正则表达式(使用一些时髦的字符来逃避 shell 解释):
npm search /^express\[\ \]
NAME DESCRIPTION AUTHOR DATE VERSIO express Sinatra inspired web development framework =tjholowaychuk… 2014-05-12 4.2.0
但是,如果您得到的结果太多,那么去 npm 站点查看确切的包名称可能会更容易。
当您知道包的名称时,您可以安装它。 由于我们需要 express 的命令行功能,我们将全局安装它:
npm install -g express
这会将 express 包及其所有依赖项下载并安装到全局 npm 根目录中。
如果我们希望将包放在本地应用程序的模块目录中,以便可以使用 require()
行将其包含在应用程序中,您可以键入:
cd ~/projects/test_package npm install express
然而,我们实际上并不需要在这两个地方安装包和依赖项,我们将在下面向您展示如何避免这种情况。
卸载、重复数据删除、修剪和链接包
由于我们希望这个包在我们的全局和本地范围内,我们需要为它提供一种在两个地方都可以使用这个包的方法。
首先,让我们卸载本地版本的包,如下所示:
npm uninstall express
现在,我们可以告诉 npm 我们要将全局副本链接到本地包,如下所示:
npm link express
这将在我们的 node_modules
目录中创建一个指向全局包的符号链接,使其在两个地方都可用。
我们可以通过卸载全局版本,进入本地包并全局链接来完成相反的操作。 我们可以这样做。
首先,卸载本地链接和全局包:
npm uninstall express # This removes the symbolic link in local npm uninstall -g express # This removes the actual package in global
将包重新安装为本地包:
npm install express
该软件包位于我们的本地应用程序目录(~/projects/test_package/node_modules
)中,但未全局安装。 我们可以将它全局链接到包目录并调用链接子命令而不需要额外的参数:
cd ~/projects/test_package/node_modules/express npm link
我们可以使用相同的过程使我们自己的 test_package
可用于我们正在创建的其他包(假设它具有正确的目录结构和文件,但现在没有)。
当我们安装和改组我们的包时,我们应该利用 dedupe
功能。
我们的包在层次结构中安装了依赖项。 但是,某些包可能具有共享依赖项。 如果我们的包目录包含两个模块,每个模块都需要一个名为“blah”的包,它将被安装两次,一次在“package1/node_modules/blah”下,一次在“package2/node_modules/blah”下。
dedupe
子命令查找这些情况并将共享依赖项上移一个级别,两个包都将找到依赖项的单个安装。
例如,我们可以尝试在 express 目录中对我们的包的依赖项进行重复数据删除。 我们可以在包目录中这样做:
cd ~/projects/test_package/node_modules/express npm dedupe
这将找到两个包(mime 和调试)。 调试模块实际上也是另一个名为“send”的 express 模块依赖项的依赖项。 这通常会被删除重复数据,但存在版本冲突,因此在这种情况下什么都不做。
假设您已经对包进行了重复数据删除,这会将一些依赖项向上移动,但随后您卸载了以前拥有依赖包的包。 不会删除依赖项,因为它不再位于包子目录中。
在这些情况下,我们可以告诉 npm “修剪”我们系统中不需要的包。 这意味着未在我们父包的依赖项列表中列出的包。
您可以通过调用删除不需要的依赖项:
npm prune
这将删除不需要的包。
查找过时的包并更新它们
如果您需要找出哪些软件包已过期,可以通过键入以下内容来完成:
npm outdated
. . . Package Current Wanted Latest Location type-is 1.1.0 1.1.0 1.2.0 express > type-is debug 0.8.0 0.8.0 0.8.1 express > send > debug
这将为您提供具有更新版本的软件包列表。 它将为您提供一个图表,显示已安装的内容、您的应用程序请求的内容以及与当前版本的不同之处。
如果你想更新你的包,你应该编辑包的 package.json
中请求的版本,然后发出更新命令:
npm update
结论
我们已经介绍了使用 npm 作为包管理器的一些更常见的方法。 您现在应该对如何获取和管理其他人的包以用于您自己的开发有一个很好的了解。
在我们关于 npm 的 next 指南中,我们将介绍如何配置 npm 以改变其行为,如何使用 npm 创建包,以及如何发布你的包并与 npm 网站交互。