包描述文件package.json详解

包描述文件

包描述文件用于表达非代码相关的信息,它是一个JSON格式的文件——package.json,位于包的根目录下,是包的重要组成部分。而npm的所有行为都与包描述文件的字段息息相关。

CommonJS为package.json文件定义一些必须的字段。

  1. name:包名。规范定义它需要小写字符和数字的组成,可以包含. \ _和 - ,但不允许出现空格。包名必须是唯一的,以免对外公布时产生重名冲突的误解。除此以外,NPM还建议不要在包名中附带上node或js来重复表示它是JavaScript或Node模块。
  2. description:包简介。
  3. version:版本号。
  4. keywords:关键词数组,NPM中主要用来做分类搜索。一个好的关键词数组有利于用户快速找到你编写的包。
  5. maintainers:包维护者列表,每个维护者由name、email和web这3个属性组成。

NPM通过该属性进行权限认证。

  1. contribuctors:贡献者列表。
  2. bugs:一个可以反馈bug的网页地址或邮箱地址。
  3. licenses:当前包所使用的许可证列表,表示这个包在哪些许可证下使用。
  4. repositories:托管源代码的位置列表,表明可以通过哪些方式和地址访问包的源代码。
  5. dependencies:使用当前包所依赖的包列表。这个属性非常重要,NPM会通过这个属性自动加载依赖的包。

除了必选字段外,规范还定义了一部分可选的字段

  1. homepage:当前包的网站地址。

  2. os:操作系统支持的列表。这些操作系统的取值包括aix,freebsd,Linux,macos,solaris,vxworks,windows。如果设置了列表为空时,则不对操作系统做任何假设。

  3. CPU:CPU架构的支持列表。

  4. engine:支持的js引擎列表,有效的引擎列表取值包括ejs,flusspferd,gpsee,jsc,spidermonkey,narwhal,node,v8.

  5. builtin:标志当前包是否是内建在底层系统的标准组件。

  6. directories:包目录说明。

  7. implements:实现规范的列表,标志当前包实现了CommonJS的那些规范。

  8. scripts:脚本说明对象。它主要被包管理器用来安装,编译,测试和卸载包。

    //示例如下:
    "scripts":{
    	"install":"install.js",
    	"uninstall":"uninstall.js",
    	"build":"build.js",
    	"test":"test.js"
    }
    

包规范的定义可以帮助Node解决依赖包安装的问题,而NPM正是基于该规范进行了实现。最初,NPM工具是有Issac Z.Schlueter单独创建,提供给node服务的Node包管理器,需要单独安装。后来,在v6.3版本时集成进Node中作为默认包管理器,作为软件包的一部分一起安装。

在包描述文件的规范中,NPM实际需要的字段主要有name,version,description,keywords,repositories,author,bin,main,scripts,engines,dependencies,devDependencies。

与包规范的区别在于多了author,bin,main和devDependencies这4个字段。

author:包作者。

bin:一些包作者希望包可以作为命令行工具使用。配置好bin字段后,通过npm install package_name -g命令可以将脚本添加到执行路径中,之后可以在命令行中直接执行。通过-g命令安装的模块包称为全局模式。

main:模块引入方法require()在引入包时,会优先检查这个字段,并将其作为包中其余模块的入口。如果不存在这个字段,require()方法会查找包目录下的 index.js , index.node , index.json 文件作为默认入口。

devDependencies:一些模块只在开发时需要依赖。配置这个属性,可以提示包的后续开发者安装依赖包。

//以下是node比较有名的框架express项目的package.json文件
{
  "name": "express",
  "description": "Fast, unopinionated, minimalist web framework",
  "version": "4.17.1",
  "author": "TJ Holowaychuk ",
  "contributors": [
    "Aaron Heckmann ",
    "Ciaran Jessup ",
    "Douglas Christopher Wilson ",
    "Guillermo Rauch ",
    "Jonathan Ong ",
    "Roman Shtylman ",
    "Young Jae Sim "
  ],
  "license": "MIT",
  "repository": "expressjs/express",
  "homepage": "http://expressjs.com/",
  "keywords": [
    "express",
    "framework",
    "sinatra",
    "web",
    "rest",
    "restful",
    "router",
    "app",
    "api"
  ],
  "dependencies": {
    "accepts": "~1.3.7",
    "array-flatten": "1.1.1",
    "body-parser": "1.19.0",
    "content-disposition": "0.5.3",
    "content-type": "~1.0.4",
    "cookie": "0.4.0",
    "cookie-signature": "1.0.6",
    "debug": "2.6.9",
    "depd": "~1.1.2",
    "encodeurl": "~1.0.2",
    "escape-html": "~1.0.3",
    "etag": "~1.8.1",
    "finalhandler": "~1.1.2",
    "fresh": "0.5.2",
    "merge-descriptors": "1.0.1",
    "methods": "~1.1.2",
    "on-finished": "~2.3.0",
    "parseurl": "~1.3.3",
    "path-to-regexp": "0.1.7",
    "proxy-addr": "~2.0.5",
    "qs": "6.7.0",
    "range-parser": "~1.2.1",
    "safe-buffer": "5.1.2",
    "send": "0.17.1",
    "serve-static": "1.14.1",
    "setprototypeof": "1.1.1",
    "statuses": "~1.5.0",
    "type-is": "~1.6.18",
    "utils-merge": "1.0.1",
    "vary": "~1.1.2"
  },
  "devDependencies": {
    "after": "0.8.2",
    "connect-redis": "3.4.1",
    "cookie-parser": "~1.4.4",
    "cookie-session": "1.3.3",
    "ejs": "2.6.1",
    "eslint": "2.13.1",
    "express-session": "1.16.1",
    "hbs": "4.0.4",
    "istanbul": "0.4.5",
    "marked": "0.6.2",
    "method-override": "3.0.0",
    "mocha": "5.2.0",
    "morgan": "1.9.1",
    "multiparty": "4.2.1",
    "pbkdf2-password": "1.2.1",
    "should": "13.2.3",
    "supertest": "3.3.0",
    "vhost": "~3.0.2"
  },
  "engines": {
    "node": ">= 0.10.0"
  },
  "files": [
    "LICENSE",
    "History.md",
    "Readme.md",
    "index.js",
    "lib/"
  ],
  "scripts": {
    "lint": "eslint .",
    "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/",
    "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/",
    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/",
    "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/"
  },
  "__npminstall_done": "Sun Feb 16 2020 11:22:54 GMT+0800 (GMT+08:00)",
  "_from": "[email protected]",
  "_resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz"
}

NPM常用功能

你可能感兴趣的:(包描述文件package.json详解)