nodejs中package.json编写规范
更新日期:
概述
我们在使用nodejs做web开发或者使用npm管理各种包资源的时候,在包的根目录下一定会有package.json文件。这是因为nodejs采用了CommonJS规范。package.json是CommonJS规定的用来描述包的文件。
严格符合CommonJS规范的包应该具备以下特征:
1. package.json必须在包的顶层目录下;
2. 二进制文件应该在bin目录下;
3. JavaScript代码应该在lib目录下;
4. 文档应该在doc目录下;
5. 单元测试应该在test目录下。
nodejs在调用某个包时,会首先检查包中package.json文件的main字段,将其作为包的接口模块,如果package.json或main字段不存在,会尝试寻找index.js或index.node作为包的入口。
说明
符合规范的package.json文件应该含有以下字段。
name
包的名称。name必须设置,且必须是唯一,否则你的包将不会被安装。name的设置一般遵循以下规则:
1. 全部小写;
2. 不要包含"js"或"node"字符;
3. 不要以点号和下划线开头,不使用不符合url字符串格式标准的字符;
4. 要言简意赅;
5. 如果你的包需要发布,则要保证name在npm注册表中。
version
包的版本。version必须设置。name和version组合构成你的包的唯一标识。版本号遵循 MAJOR.MINOR.PATCH 的编写规则。
1. MAJOR 主版本。当包有重大修改时应该改变。
2. MINIR 小版本。当包进行了一些功能性修改时应该改变。
3. PATH 补丁。当包或进行了bug修复后应该修改。
description
包的描述信息。应该言简意赅。
keywords
包的关键词。应该是一个集合。
homepage
项目主页的url地址。
注意: homepage不同于url。如果在package.json中设置了url字段,npm注册表会认为包被重定向到其他的发布位置,这样的话你会被鄙视的。所以不推荐使用url字段。
bugs
bug提交的url地址或者email邮箱。
例如:
{
"url" : "http://github.com/owner/project/issues",
"email" : "project@hostname.com"
}
license
包的许可。一些通用的许可如 MIT 或 BSD-3-Clause。更多许可请参见 SPDX License List
例如:
"license": "MIT"
author
包的作者。包括作者的姓名,也可添加email和个人主页信息。
例如:
{
"name" : "Barney Rubble",
"email" : "b@rubble.com",
"url" : "http://barnyrubble.tumblr.com/"
}
或者简写成:
"Barney Rubble <b@rubble.com> (http://barnyrubble.tumblr.com/)"
contributors
包的参与者。应该是一个集合。内容与author字段相同。
files
包含到包中的文件。应该是一个集合。可以在包的根目录下提供了一个”.npmignore”文件,指定不被包包含的文件。
MAIN
指向包的主入口。例如,如果你的包名为 foo,当用户通过 require('foo') 访问包时,就会返回你的主模块的exports对象。
例如:
"main": "lib/foo.js"
注: main在markdown中做标题时会导致后面的部分文字格式错误,故这里将main写成大写的MAIN。
bin
用于对外暴露包中的可执行脚本文件。应该是一个hash对象。对象的key应该是可执行脚本的名字,value应该是指向可执行脚本文件的相对路径。包安装时会自动安装这些可执行脚本路径到环境变量PATH中。
例如:
"bin" : { "cli" : "./cli.js" }
如果只有一个可执行脚本文件,也可简写成:
"bin": "./path/to/program"
man
指示帮助文档的位置。可以是单个或多个文件。
单文件示例:
"man" : "./man/doc.1"
多文件示例:
"man" : [ "./man/foo.1", "./man/bar.1" ]
directories
显示包的组织结构。
directories.lib: 指示库的位置。
directories.bin:意义同bin字段;如果已经设置过bin字段,则这里的bin无效。
directories.man:意义同man字段。
directories.doc:放置markdown文件的位置。
directories.example: 放置样例脚本文件的位置。
例如:
"directories":{"doc":"./doc","man":"./man","lib":"./lib","bin":"./bin"}
repository
指示包的源代码存储的位置和类型。可以帮助其他想贡献代码的人。
例如存储到github上:
"repository" :
{
"type" : "git",
"url" : "http://github.com/npm/npm.git"
}
或者存放到svn上:
"repository" :
{
"type" : "svn",
"url" : "http://v8.googlecode.com/svn/trunk/"
}
scripts
对外暴露额外的npm命令。应该是一个hash对象。对象的key是npm命令,value是脚本或脚本的路径。这些命令可以通过 npm run {command name} 或 npm run-script {command name} 来执行这些命令。
例如:
"script": {
"test": "vows --spec --isolate",
"start": "node index.js",
"predeploy": "echo im about to deploy",
"postdeploy": "echo ive deployed",
"prepublish": "coffee --bare --compile --output lib/foo src/foo/*.coffee"
}
dependencies
包依赖的其他包。当按照包时,依赖的包会一起被安装。是一个包含包名和版本范围的hash对象。
版本范围的规则如下:
version必须与指定的版本号完全匹配>version必须高于指定的版本号>=version必须高于或等于指定的版本号<version必须小于指定的版本号<=version必须小于或等于指定的版本号~version必须与指定的版本号趋近。如~1.2.3 := >=1.2.3 <1.3.0^version必须与指定版本号匹配。如^1.2.3 := >=1.2.3 <2.0.01.2.x等价于>=1.2.0 <1.3.0*匹配任何版本""空字符,等价于*version1 - version2等价于>=version1 <=version2range1 || range2range1 或 range2 范围内的版本都可以github...从git上获取指定版本user/repo从github上获取指定版本http://...从url地址获取指定版本
更多规则可以参见 npm版本语义。
例如:
"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
开发或测试时的包依赖。不用安装其他额外的文档。可以使用 npm install --dev 来安装。设置规则与dependencies字段一样。
engines
指定node的版本。版本的设置规则同dependencies字段。
例如:
"engines" : { "node" : ">=0.10.3 <0.12" }
preferGlobal
指示包应该在全局安装。安装命名为 npm install -g {module-name}。
例如:
"preferGlobal": true
private
指示包不应该被发布。
例如:
"private": true
publishConfig
包发布时的配置参数。这些配置参数会覆盖默认的npm配置。最常见的用法是使用publishConfig来发布你的包到私有npm注册表,这样既能利用npm提供的服务,又可以私有你的包。