您的位置:首页 > 产品设计 > 产品经理

工具系列——npm对的包管理

2015-07-21 21:35 423 查看
摘要: 介绍了使用NPM来安装,卸载,删除任何第三方模块,还学习了如何配合package.json文件来使用NPM管理应用程序依赖项。还有npm常用的命令。

最近要开始学习node了,之前虽然也一直用npm但都是零零散散,现在从网上找一些关键点做下记录。

Node包管理器介绍

Node包管理器(NPM: Node Package Manager)

NPM包含三部分:一个用来存放第三方包的代码库,一个管理本地已经安装包的机制,一个用来定义包依赖关系的标准。NPM提供了一个公共的注册服 务,它包含了大家发布的所有包,并提供了一个命令行工具,用来下载,安装和管理这些包。你可以按照Node的包格式标准来制定你的包或者应用需要依赖的其 他第三方包。

虽然不用了解NPM就可以开始使用Node,但是如果要用第三方包你就必须要学习它了,因为Node本身只提供了一些低层的API,使用第三方模块 可以大幅减少开发复杂度,不用什么都得亲自编码。NPM允许你在一个沙箱里下载和使用模块,你可以尽情地试验你感兴趣的东西,而不用担心污染全局的包环 境。

NPM和 Node以前需要独立安装,从0.6.0版本以后,NPM已经包含在了Node安装包里。

NPM模块的全局和本地模式

NPM的操作主要有两种模式:全局和本地。这两种模式会影响包存放的目录结构,以及Node加载包时的顺序。

本地模式是NPM的默认操作模式,在这个模式下,NPM只工作在工作目录下,不会造成系统范围的修改,这个模式让你在某个Node程序下尽情地安装,测试模块,而不会影响你电脑上的其他Node程序。

全局模式适合那些将被很多程序使用,而且总是被全局加载的公共模块,比如命令行工具这些公不会被应用程序直接使用的模块。

如果你不知道一个模块该用哪个模式安装,那就应该使用本地模式。如果一个模块的作者需要某个模块被全局的安装,通常他会在安装说明里指出。

全局模式

如果你安装Node时使用的默认目录,在全局模式下面,NPM会把包安装到/usr/local/lib/node_modules。如果你执行下 面的命令,NPM会搜索并下载名为sax的最新版并安装到/usr/local/lib/node_modules/sax目录下。

$ npm install –g sax
注意:如果你当前shell用户没有足够的权限,你需要使用root用户登录或者使用sudo来执行命令:
$ sudo npm install –g sax
随后在你的Node脚本里需要sax模块的时候,使用下面的语句来加载:
var sax = require(‘sax');
如果你没有在应用程序目录下用本地模式安装过sax,Node将会在前面的安装目录里查找名为sax的模块,否则会优先加载本地版本。

默认模式是本地模式,因此你需要在NPM命令后加上-g标记来启用全局模式。

本地模式

本地模式是Node包依赖机制的默认推荐模式,这个模式下,NPM安装的所有东西都在当前工作目录(根目录也不例外),而不会影响任何全局的设置。 这种机制可以让你一个个的设置应用程序的依赖模块以及它们的版本,而不用担心会污染全局的模块空间。这意味着你可以有依赖同一个模块不同版本的两个应用, 它们却不会产生冲突。

在这个模式下,NPM使用当前工作目录下的node_modules目录来存放模块,比如你当前工作目录是/home/user/apps /my_app,NPM将会用/home/user/apps/my_app/node_modules来存放所有本地模块。这意味着,如果你在代码里使 用模块名来引用模块,Node首先会到这个本地的node_modules目录下查找,如果没找到才会去搜索全局的node_modules目录,本地模 块优先级总是高于全局模块。

安装模块

使用下面命令来安装一个模块的最新版本:
$ npm install <package name>

例如,下载和安装名一个名为sax的模块的最新版本,你首先需要把你应用程序的根目录设置为当前目录,然后输入:
$ npm install jquery
这个操作,会在当前目录下建立node_modules子目录(如果不存在的话),然后在下面安装sax模块。

你也可以通过下面的命令,来选择安装某个特定的版本:
$ npm install <package name>@<version spec>

使用指定的版本号替换命令里的占位符即可,比如,要下载sax模块的0.2.5版本,你只用运行:
$ npm install sax@0.2.5

或者,安装版本号小于0.3的最新版:
$ npm install sax@”<0.3”

甚至可以指定一个版本范围:
$ npm install sax@">=0.1.0 <0.3.1"

卸载模块

使用下面命令可以卸载一个本地模块:
$ npm uninstall <package name>

如果要卸载的是一个全局模块,加上-g标记即可:
$ npm uninstall -g <package name>

更新本地模块:

$ npm update <package name>

这个命令会尝试获取最新版的模块包并更新本地版本,如果本地没有安装,则会安装它,如果需要更新的是全局环境,需要加上-g标记:
$ npm update –g <package name>

使用可执行文件

模块可以包含一个或多个可执行文件,如果你使用默认目录设置来安装一个全局模块,NPM会把可执行文件安装到/usr/local/bin目录下, 这个目录通常也被设置为系统PATH环境变量的一部分。如果你局部安装这个模块,NPM会把所有可执行文件放到./node_modules/.bin目 录下。

处理依赖关系

NPM不仅安装你需要的模块包,而且会安装这些模块所依赖的其它模块,比如,如果你需要安装模块A,而A又依赖模块B和C,那么在你安装A的时候B和C同时会被安装到./node_modules/A/node_modules目录下。

例如,你用下面的命令本地安装了一个叫nano的模块:
$npm install nano

NPM的输出会类似这样:

这告诉你nano模块依赖underscore和request两个模块,并且还指出了安装的版本。如果你现在去查看./node_modules/nano/node_modules目录,你会发现这两个模块已经被安装了:
$ ls node_modules/nano/node_modules

request underscore

使用package.json文件定义依赖关系

当开始编写一个应用程序时,可以在应用程序根目录创建一个package.json文件来定义应用程序的元数据,比如应用的名字,作者,代码库地址,联系方式等等。程序依赖的外部模块也在这个文件里指定。

如果不打算把程序发布到NPM上,就可以不用建这个文件,不过即使你的程序是私有的,这个文件其实也有用,它可以告诉NPM这个应用程序的依赖关 系。(译者注:比如你把项目源码从开发环境复制到生产环境,可以通过调用npm install来一次性安装所有依赖包,npm会通过package.json内指定的依赖关系来自动完成依赖模块的下载安装,不用自己一个个去操作,稍 候有详细介绍)

package.json是一个JSON格式的文件,包含了一系列属性,但是如果仅仅是为了说明程序的依赖关系,则只用一个 dependencies属性就行。比如,一个叫MyApp的应用程序依赖sax,nano和request模块,只需要建立这样一个 package.json:

复制代码 代码如下:

{

"name" : "MyApp",

"version" : "1.0.0",

"dependencies" : {

"sax" : "0.3.x",

"nano" : "*",

"request" : ">0.2.0"

}

}

你指定了MyApp应用,依赖0.3版本的sax,任意版本的nano,以及版本高于0.2.0的request模块。

注意:你可能发现,如果你指定了name和version字段,NPM会不工作,这只会发生在旧版本的NPM,因为最初NPM是针对公共模块使用的,而不是私有程序。

然后,在应用程序的根目录,执行:

复制代码 代码如下:

$ npm install

这样,NPM就会分析依赖关系以及你本地的node_modules目录,并自动的下载和安装缺失的模块。

你也可以通过下面的命令把所有本地模块更新到符合你定义的依赖项设置的最新版本:

复制代码 代码如下:

$npm update

事实上,你仅用update方法就行了,因为它会让NPM自动获取那些缺失的依赖模块。

package.json介绍

name
~ 在package.json中最重要的就是name和version字段。他们都是必须的,如果没有就无法install;
~ 想好名字之前先去npm registry查看一下这个名字是否已经被使用了,http://registry.npmjs.org/

version
~ version必须能被 node-semver解析,它被包在npm的依赖中;
~ name和version一起组成的标识在假设中是唯一的。改变包应该同时改变version

private
~ 如果你设置"private": true,npm就不会发布它;
~ 这是一个防止意外发布私有库的方式。如果你要确定给定的包是只发布在特定registry(如内部registry)的,用publishConfighash的描述来重写registry的publish-time配置参数

scripts
~ “scripts”是一个由脚本命令组成的hash对象,他们在包不同的生命周期中被执行。key是生命周期事件,value是要运行的命令。

dependencies
~ 依赖是给一组包名指定版本范围的一个hash。这个版本范围是一个由一个或多个空格分隔的字符串。依赖还可以用tarball或者git URL

  以上五项仅仅是Express4 package.json使用的,其他细节可参考文档 传送门https://www.npmjs.org/doc/files/package.json.html

npm中常用的命令

1、npm install moduleNames:安装Node模块
安装完毕后会产生一个node_modules目录,其目录下就是安装的各个node模块。

node的安装分为全局模式和本地模式。
一般情况下会以本地模式运行,包会被安装到和你的应用程序代码的本地node_modules目录下。
在全局模式下,Node包会被安装到Node的安装目录下的node_modules下。

全局安装命令为$npm install -g moduleName。
获知使用$npm set global=true来设定安装模式,$npm get global可以查看当前使用的安装模式。

示例:
npm install express
默认会安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本,如npm install express@3.0.6

npm install <name> -g
将包安装到全局环境中

但是代码中,直接通过require()的方式是没有办法调用全局安装的包的。全局的安装是供命令行使用的,就好像全局安装了vmarket后,就可以在命令行中直接运行vm命令

npm install <name> --save
安装的同时,将信息写入package.json中项目路径中如果有 package.json文件时,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包,这样代码提交到github时,就不用提交node_modules这个文 件夹了。

2、npm view moduleNames:查看node模块的package.json文件夹
注意事项:如果想要查看package.json文件夹下某个标签的内容,可以使用$npm view moduleName labelName

3、npm list:查看当前目录下已安装的node包
注意事项:Node模块搜索是从代码执行的当前目录开始的,搜索结果取决于当前使用的目录中的node_modules下的内容。$ npm list parseable=true可以目录的形式来展现当前安装的所有node包

4、npm help:查看帮助命令

5、npm view moudleName dependencies:查看包的依赖关系

6、npm view moduleName repository.url:查看包的源文件地址

7、npm view moduleName engines:查看包所依赖的Node的版本

8、npm help folders:查看npm使用的所有文件夹

9、npm rebuild moduleName:用于更改包内容后进行重建

10、npm outdated:检查包是否已经过时,此命令会列出所有已经过时的包,可以及时进行包的更新

11、npm update moduleName:更新node模块

12、npm uninstall moudleName:卸载node模块

13、一个npm包是包含了package.json的文件夹,package.json描述了这个文件夹的结构。访问npm的json文件夹的方法如下:
$ npm help json
此命令会以默认的方式打开一个网页,如果更改了默认打开程序则可能不会以网页的形式打开。

14、发布一个npm包的时候,需要检验某个包名是否已存在
$ npm search packageName

15、npm init:会引导你创建一个package.json文件,包括名称、版本、作者这些信息等

16、npm root:查看当前包的安装路径
npm root -g:查看全局的包的安装路径

17、npm -v:查看npm安装的版本

免责说明

1、本博客中的文章摘自网上的众多博客,仅作为自己知识的补充和整理,并分享给其他需要的coder,不会用于商用

2、因为很多博客的地址已经记不清楚了,所以不会在这里标明出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  node npm