![](https://img.haomeiwen.com/i6522842/b1d8735afc56be76.png)
package.json是用来做什么的
package.json的主要功能有两个:
- 用来保存工程元数据
- 用来描述工程依赖项
npm,node都要用到package.json:
- node在调用require的时候去查找模块,会按照一个次序去查找,package.json是查找中的一个环节。详见[require()源码解读]
(http://www.ruanyifeng.com/blog/2015/05/require.html)
![](https://img.haomeiwen.com/i6522842/ca4947749b5fe93f.png)
- npm用的就比较多,其中的"dependencies"字段就是本模块的依赖的模块清单。每次
npm update
的时候,npm会自动的把依赖的模块也下载下来。当npm install
本模块的时候,会把这里提到的模块都一起下载下来。通过package.json,可以很好的管理好模块的依赖关系。
package.json的字段
从nodejs官网下载了一个完整的package.json示例
{
"name": "module-name",
"version": "10.3.1",
"description": "An example module to illustrate the usage of a package.json",
"author": "Your Name <you.name@example.org>",
"contributors": [
{
"name": "Foo Bar",
"email": "foo.bar@example.com"
}
],
"bin": {
"module-name": "./bin/module-name"
},
"scripts": {
"test": "vows --spec --isolate",
"start": "node index.js",
"prepublish": "coffee --bare --compile --output lib/foo src/foo/*.coffee"
},
"main": "lib/foo.js",
"repository": {
"type": "git",
"url": "https://github.com/nodejitsu/browsenpm.org"
},
"bugs": {
"url": "https://github.com/nodejitsu/browsenpm.org/issues"
},
"keywords": [
"nodejitsu",
"example",
"browsenpm"
],
"dependencies": {
"primus": "*",
"async": "~0.8.0",
"express": "4.2.x",
"winston": "git://github.com/flatiron/winston#master",
"bigpipe": "bigpipe/pagelet",
"plates": "https://github.com/flatiron/plates/tarball/master"
},
"devDependencies": {
"vows": "^0.7.0",
"assume": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
"pre-commit": "*"
},
"preferGlobal": true,
"private": true,
"publishConfig": {
"registry": "https://your-private-hosted-npm.registry.nodejitsu.com"
},
"license": "MIT"
}
name(必填字段)
npm包的名称,值必须为小写
version(必填字段)####
工程的版本号。
版本号分为三部分组成:主版本号、次版本号、修号。
- 主版本号: 当做了不兼容的API修改。
- 次版本号: 当做了向下兼容的功能性新增。
- 修订号: 当做了向下兼容的问题修正。
- 先行版本及版本编译信息可以加到“主版本号、次版本号、修订号”的后面,作为延伸。
表达式 | 版本范围 | 说明 |
---|---|---|
1.2.1 | 1.2.1 | 匹配指定版本,这里是匹配1.2.1 |
^1.0.0 | >=1.0.0 且 <2.0.0 |
^ 表示与指定的版本兼容,左边第一个非0字段不可变,后面的可变,即1.x.x但不得到2.0.0 |
description
一段字符串,用来描述这个npm模块的作用,通过npm search的时候会用到。
keywords
一个由字符串组成的数组,也有助于别人通过npm search的时候快速找到你的包。
homepage
这个项目的主页URL。 注意:这里和url属性不是一个东西,如果你填了url属性,npm的注册工具会认为你把项目发布到别的地方了,就不会去npm官方仓库去找。
main
main字段规定了程序的主入口文件。如果你的模块命名为foo,用户安装后,就会通过require("foo")来引用该模块,返回的内容就是你的模块的 module.exports指向的对象。
这是一个相对于你的模块文件夹的模块ID,对于大多数的模块,有个主脚本就足够了。
bin
很多模块有一个或多个可执行文件需要配置到PATH路径下。npm就是通过这个特性安装,使得npm可执行。
要用这个功能,给package.json中的bin字段一个命令名到文件位置的map。初始化的时候npm会将他链接到prefix/bin(全局初始化)或者./node_modules/.bin/(本地初始化)。
例如:一个myapp模块可能是这样:
{ "bin" : { "myapp" : "./cli.js" } }
所以,当你安装myapp,npm会从cli.js文件创建一个到/usr/local/bin/myapp路径下。
如果你只有一个可执行文件,并且名字和包名一样。那么你可以只用一个字符串,比如:
{ "name": "my-program"
, "version": "1.2.5"
, "bin": "./path/to/program" }
和下面是一样的效果:
, "version": "1.2.5"
, "bin" : { "my-program" : "./path/to/program" } }
man
用来给Linux下的man命令查找文档地址,是个单一文件或者文件数组。 如果是单一文件,安装完成后,他就是man + <pkgname>的结果,和此文件名无关,例如:
{ "name" : "foo"
, "version" : "1.2.3"
, "description" : "A packaged foo fooer for fooing foos"
, "main" : "foo.js"
, "man" : "./man/doc.1"
}
通过man foo命令会得到 ./man/doc.1 文件的内容。
如果man文件名称不是以模块名称开头的,安装的时候会给加上模块名称前缀。因此,下面这段配置:
{ "name" : "foo"
, "version" : "1.2.3"
, "description" : "A packaged foo fooer for fooing foos"
, "main" : "foo.js"
, "man" : [ "./man/foo.1", "./man/bar.1" ]
会创建一些文件来作为man foo和man foo-bar命令的结果。
man文件必须以数字结尾,或者如果被压缩了,以.gz结尾。数字表示文件将被安装到man的哪个部分。
{ "name" : "foo"
, "version" : "1.2.3"
, "description" : "A packaged foo fooer for fooing foos"
, "main" : "foo.js"
, "man" : [ "./man/foo.1", "./man/foo.2" ]
}
会创建 man foo 和 man 2 foo 两条命令。
scripts
script可以用来保存一些脚本。这些脚本在执行npm run {command name}或者npm run-script {command name}时就会运行。如果需要运行包内部的命令,直接使用命令名称就可以,而不必在敲入命令的相对路径。
dependencies
dependencies属性是一个对象,配置模块依赖的模块列表,key是模块名称,value是版本范围,版本范围是一个字符,可以被一个或多个空格分割。
dependencies也可以被指定为一个git地址或者一个压缩包地址。
devDependencies
如果别人只想使用你的模块,而不需要开发和测试所需要的依赖的时候,这种情况下,可以将开发测试依赖的包,写到devDependencies中。
license
许可证。虽然在国内,许可证不是很受人重视。但既然我们用了开源软件,就要遵守开源的游戏规则。该用什么许可就用什么许可。大多数情况下都是MIT许可。
![](https://img.haomeiwen.com/i6522842/0a569a8267dc37ed.png)
网友评论