1.概述
每个项目的根目录下面,一般都有一个package.json
文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install
命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
下面是一个最简单的package.json文件,只定义两项元数据:项目名称和项目版本。
{ "name" : "xxx", "version" : "0.0.0", }
package.json
文件就是一个JSON对象,该对象的每一个成员就是当前项目的一项设置。比如name
就是项目名称,version
是版本(遵守“大版本.次要版本.小版本”的格式)。
下面是一个更完整的package.json文件
1 { 2 "name": "webapp", 3 "versuion":"1.0.0", 4 "private": true, 5 "scripts": { 6 "start": "roadhog server", 7 "build": "roadhog build", 8 "lint": "eslint --ext .js src test", 9 "http": "http-server dist -p 8000" 10 }, 11 "engines": { 12 "install-node": "6.9.2" 13 }, 14 "dependencies": { 15 "antd": "^3.0.0", 16 "aphrodite": "^1.2.5", 17 "axios": "^0.16.2", 18 "babel-polyfill": "^6.26.0", 19 "babel-runtime": "^6.9.2", 20 "classnames": "^2.2.5", 21 "console-polyfill": "^0.3.0", 22 "crypto-js": "^3.1.9-1", 23 "dva": "^2.1.0", 24 "dva-loading": "^1.0.0", 25 "echarts": "^3.8.5", 26 "echarts-for-react": "^2.0.0", 27 "global": "^4.3.2", 28 "jquery": "^3.2.1", 29 "json-server": "^0.12.1", 30 "keymaster": "^1.6.2", 31 "less-vars-to-js": "^1.2.0", 32 "mockjs": "^1.0.1-beta3", 33 "path-to-regexp": "^2.1.0", 34 "qs": "^6.5.1", 35 "rc-queue-anim": "^1.6.2", 36 "react": "^16.0.0", 37 "react-cookie": "^1.0.5", 38 "react-dom": "^16.0.0", 39 "socket.io-client": "^1.7.3", 40 "swiper": "^4.3.3" 41 }, 42 "devDependencies": { 43 "babel-core": "^6.26.3", 44 "babel-eslint": "^7.1.1", 45 "babel-loader": "^7.1.4", 46 "babel-plugin-dva-hmr": "^0.3.2", 47 "babel-plugin-import": "^1.4.0", 48 "babel-plugin-transform-runtime": "^6.9.0", 49 "babel-preset-react": "^6.24.1", 50 "eslint": "^3.12.2", 51 "eslint-config-airbnb": "^13.0.0", 52 "eslint-plugin-import": "^2.2.0", 53 "eslint-plugin-jsx-a11y": "^2.2.3", 54 "eslint-plugin-react": "^6.8.0", 55 "expect": "^1.20.2", 56 "husky": "^0.12.0", 57 "redbox-react": "^1.3.2", 58 "redux-logger": "^3.0.6", 59 "roadhog": "^1.4.1" 60 } 61 }
2.各个字段的含义。
1.private的含义
如果这个属性被设置为true,npm将拒绝发布它,这是为了防止一个私有模块被无意间发布出去。如果你只想让模块被发布到一个特定的npm仓库,如一个内部的仓库,可与在下面的publishConfig中配置仓库参数。
2.scripts的含义
scripts属性是一个对象,里边指定了项目的生命周期个各个环节需要执行的命令。key是生命周期中的事件,value是要执行的命令。
具体的内容有 install start stop 等,详见https://docs.npmjs.com/misc/scripts
scripts
指定了运行脚本命令的npm命令行缩写,比如start指定了运行npm run start
时,所要执行的命令。
下面的设置指定了npm run start
、npm run build等
时,所要执行的命令。
"scripts": { "start": "roadhog server", "build": "roadhog build", "lint": "eslint --ext .js src test", "http": "http-server dist -p 8000" },
3.engines的含义
engines
字段指明了该模块运行的平台,比如 Node 的某个版本或者浏览器。
"engines": { "install-node": "6.9.2" },
该字段也可以指定适用的npm
版本。
"engines" : {
"npm" : "~1.0.20"
}
4.dependencies的含义
dependencies
字段指定了项目运行所依赖的模块,是一个对象,配置模块依赖的模块列表,key是模块名称,value是版本范围,版本范围是一个字符,可以被一个或多个空格分割。
dependencies也可以被指定为一个git地址或者一个压缩包地址。
1 version 精确匹配版本 2 >version 必须大于某个版本 3 >=version 大于等于 4 <version 小于 5 <=versionversion 小于 6 ~version "约等于",具体规则详见semver文档 7 ^version "兼容版本"具体规则详见semver文档 8 1.2.x 仅一点二点几的版本 9 http://... 见下面url作为denpendencies的说明
注:不要把测试工具或transpilers写到dependencies中。
5.devDependencies的含义
devDependencies
指定项目开发所需要的模块。
如果有人想要下载并使用你的模块,也许他们并不希望或需要下载一些你在开发过程中使用的额外的测试或者文档框架。
在这种情况下,最好的方法是把这些依赖添加到devDependencies属性的对象中。
这些模块会在npm link或者npm install的时候被安装,也可以像其他npm配置一样被管理,详见npm的config文档。
对于一些跨平台的构建任务,例如把CoffeeScript编译成JavaScript,就可以通过在package.json的script属性里边配置prepublish脚本来完成这个任务,然后需要依赖的coffee-script模块就写在devDependencies属性种。
"devDependencies": { "babel-core": "^6.26.3", "babel-eslint": "^7.1.1", "babel-loader": "^7.1.4", "babel-plugin-dva-hmr": "^0.3.2", "babel-plugin-import": "^1.4.0", "babel-plugin-transform-runtime": "^6.9.0", "babel-preset-react": "^6.24.1", "eslint": "^3.12.2", "redbox-react": "^1.3.2", "redux-logger": "^3.0.6", "roadhog": "^1.4.1" }
注:
dependencies
字段指定了项目运行所依赖的模块,devDependencies
指定项目开发所需要的模块。
它们都指向一个对象。该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。
$ npm install express --save $ npm install express --save-dev 上面代码表示单独安装express模块,--save参数表示将该模块写入dependencies属性,--save-dev表示将该模块写入devDependencies属性。
3.其他字段
6.peerDependencies的含义
有时候做一些插件开发,比如grunt等工具的插件,它们往往是在grunt的某个版本的基础上开发的,而在他们的代码中并不会出现require("grunt")这样的依赖,dependencies配置里边也不会写上grunt的依赖,为了说明此模块只能作为插件跑在宿主的某个版本范围下,可以配置peerDependencies:
"peerDependencies": { "tea": "2.x" }
7.os
可以指定你的模块只能在哪个操作系统上跑:
"os" : [ "darwin", "linux" ]
也可以指定黑名单而不是白名单:
"os" : [ "!win32" ]
服务的操作系统是由process.platform来判断的,这个属性允许黑白名单同时存在,虽然没啥必要这样搞...
8.cpu
限制模块只能在某某cpu架构下运行
"cpu" : [ "x64", "ia32" ]
同样可以设置黑名单:
"cpu" : [ "!arm", "!mips" ]
cpu架构通过 process.arch 判断
9 DEFAULT VALUES
npm设置了一些默认参数,如:
"scripts": {"start": "node server.js"}
如果模块根目录下有一个server.js文件,那么npm start会默认运行这个文件。
"scripts":{"preinstall": "node-gyp rebuild"}
如果模块根目录下有binding.gyp, npm将默认用node-gyp来编译preinstall的脚本
"contributors": [...]
若模块根目录下有AUTHORS 文件,则npm会按Name (url)格式解析每一行的数据添加到contributors中,可以用#添加行注释