package.json 的理解
最近安装node 模块时发现很多问题。npm-debug时发现大都跟配置文件有关.总结下常用的属性
1.package.json必须是一个严格的json文件,而不仅仅是js里边的一个对象。其中很多属性可以通过npm-config来生成。
2.name
package.json中最重要的属性是name和version两个属性,这两个属性是必须要有的,否则模块就无法被安装,这两个属性一起形成了一个npm模块的唯一标识符。模块中内容变更的同时,模块版本也应该一起变化。
name属性就是你的模块名称,下面是一些命名规则:
name必须小于等于214个字节,包括前缀名称在内(如 xxx/xxxmodule)。
- name不能以"_"或"."开头
- 不能含有大写字母
- name会成为url的一部分,不能含有url非法字符
下面是官网文档的一些建议: - 不要使用和node核心模块一样的名称
- name中不要含有"js"和"node"。 It's assumed that it's js, since you're writing a package.json file, and you can specify the engine using the "engines" field. (See below.)
- name属性会成为模块url、命令行中的一个参数或者一个文件夹名称,任何非url安全的字符在name中都不能使用,也不能以"_"或"."开头
- name属性也许会被写在require()的参数中,所以最好取个简短而语义化的值。
- 创建一个模块前可以先到后边的网址查查name是否已经被占用.
3.version
version必须可以被npm依赖的一个node-semver模块解析。具体规则见下面的dependencies模块
4.description
一个描述,方便别人了解你的模块作用,搜索的时候也有用。
5.keywords
一个字符串数组,方便别人搜索到本模块
6.license
你应该为你的模块制定一个协议,让用户知道他们有何权限来使用你的模块,以及使用该模块有哪些限制。最简单的,例如你用BSD-3-Clause 或 MIT之类的协议,如下:
{ "license" : "BSD-3-Clause" }
7. author, contributors
"author"是一个码农, "contributors"是一个码农数组。就是开发者
8.files
"files"属性的值是一个数组,内容是模块下文件名或者文件夹名,如果是文件夹名,则文件夹下所有的文件也会被包含进来(除非文件被另一些配置排除了)
你也可以在模块根目录下创建一个".npmignore"文件(windows下无法直接创建以"."开头的文件,使用linux命令行工具创建如git bash),写在这个文件里边的文件即便被写在files属性里边也会被排除在外,这个文件的写法".gitignore"类似
8.main
main属性指定了程序的主入口文件。意思是,如果你的模块被命名为foo,用户安装了这个模块并通过require("foo")来使用这个模块,那么require返回的内容就是main属性指定的文件中 module.exports指向的对象。
它应该指向模块根目录下的一个文件。对大对数模块而言,这个属性更多的是让模块有一个主入口文件,然而很多模块并不写这个属性
10.config
用来设置一些项目不怎么变化的项目配置,例如port等
11.dependencies
dependencies属性是一个对象,配置模块依赖的模块列表,key是模块名称,value是版本范围,版本范围是一个字符,可以被一个或多个空格分割。
dependencies也可以被指定为一个git地址或者一个压缩包地址。
不要把测试工具或transpilers写到dependencies中。 下面是一些写法,详见https://docs.npmjs.com/misc/semver
- version 精确匹配版本
- >version 必须大于某个版本
- >=version 大于等于
- <version 小于
- <=versionversion 小于
- ~version "约等于",具体规则详见semver文档
- ^version "兼容版本"具体规则详见semver文档
- 1.2.x 仅一点二点几的版本
- http://... 见下面url作为denpendencies的说明
- 任何版本
- "" 空字符,和*相同
- version1 - version2 相当于 >=version1 <=version2.
- range1 || range2 范围1和范围2满足任意一个都行
- git... 见下面git url作为denpendencies的说明
- user/repo See 见下面GitHub仓库的说明
- tag 发布的一个特殊的标签,见npm-tag的文档 https://docs.npmjs.com/getting-started/using-tags
- path/path/path 见下面本地模块的说明
12 devDependencies
如果有人想要下载并使用你的模块,也许他们并不希望或需要下载一些你在开发过程中使用的额外的测试或者文档框架。
在这种情况下,最好的方法是把这些依赖添加到devDependencies属性的对象中。
这些模块会在npm link或者npm install的时候被安装,也可以像其他npm配置一样被管理,详见npm的config文档。
对于一些跨平台的构建任务,例如把CoffeeScript编译成JavaScript,就可以通过在package.json的script属性里边配置prepublish脚本来完成这个任务,然后需要依赖的coffee-script模块就写在devDependencies属性种。
13.script
scripts属性是一个对象,里边指定了项目的生命周期个各个环节需要执行的命令。key是生命周期中的事件,value是要执行的命令。
具体的内容有 install start stop 等
- prepublish: Run BEFORE the package is published. (Also run on local
npm install
without any arguments.) - publish, postpublish: Run AFTER the package is published.
- preinstall: Run BEFORE the package is installed
- install, postinstall: Run AFTER the package is installed.
- preuninstall, uninstall: Run BEFORE the package is uninstalled.
- postuninstall: Run AFTER the package is uninstalled.
- preversion, version: Run BEFORE bump the package version.
- postversion: Run AFTER bump the package version.
- pretest, test, posttest: Run by the
npm test
command. - prestop, stop, poststop: Run by the
npm stop
command. - prestart, start, poststart: Run by the
npm start
command. - prerestart, restart, postrestart: Run by the
npm restart
command. Note:npm restart
will run the stop and start scripts if norestart
script is provided.