package.json文件字段含义

747 阅读4分钟

最近发现有个项目的eslint跑不起来,重点错误信息如下:

大概就是eslint中的某个包有问题,看了下这个项目的配置,发现跟最近一直开发着的项目的配置基本一样,版本也一致,所以是哪一块出问题了呢?

既然报错提到了对应的路径,那就去看看对应文件的内容吧。好家伙,这个项目没有package-lock文件,本地安装依赖的时候,eslint-plugin-import(2.18.2)依赖的eslint-config-airbnb-base包的版本采取的是最新的版本(14.2.1),这两者之前版本组合起来会有问题,后面通过升级eslint-plugin-import解决了这个问题。

在这个过程中主要是涉及到两个点的内容:

一、^ 和 ~ 版本号怎么理解

首先版本号的格式规则:主版本(修改了不兼容的API).次要版本(新增了向下兼容的功能).修订版本(修正了向下兼容的问题)

^ 则代表更新到当前 主版本 中最新的版本(从左边开始算起,碰到 第一个不为0的数+1,后面的版本为0)

^14.2.0 即 [14.2.0, 15.0.0)
^0.2.1 即 [0.2.1, 0.3.0)
^0.0.3 即 [0.0.3, 0.0.4)

~ 则代表更新到当前 次要版本 中最新的版本(从左边开始算起,碰到 第二个不为0的数+1,后面的版本为0)

~14.2.0 即 [14.2.0, 14.3.0)
~0.2.1 即 [0.2.1, 0.2.2)

二、package.json文件字段

在看node_modules中包的package.json文件时,发现这个json文件中的字段比项目配置中用到的字段还多,比较好奇分别代表什么含义,下面以项目里安装的 eslint-config-airbnb-base的配置为例。 官方package.json介绍地址

// 带下划线的字段是npm在install的时候添加的,给npm registry用的元信息
// 该信息开发者不需要关心,所以官网也没有对这些字段进行介绍(凭个人理解加上了注释,如有错误欢迎指正)
// 其他则为项目通用配置项
{
  // 安装该模块时的参数(当不同包依赖该模块的不同版本时,参数就会有多个)
  "_args": [
    [
      // npm install 后面的参数信息
      "eslint-config-airbnb-base@14.2.0",
      // 项目的绝对路径地址
      "/Users/hby/Desktop/test/my_test"
    ]
  ],
  // 当前模块是否在本地开发时才需要
  "_development": true,
  // 上游package.json中所写的该模块的版本
  "_from": "eslint-config-airbnb-base@14.2.0",
  // 该模块实际安装的版本
  "_id": "eslint-config-airbnb-base@14.2.0",
  // 是否在打包之后的文件里面
  "_inBundle": false,
  // 该模块完整性的哈希
  "_integrity": "sha1-/onCSz+dyACMnA0NiMKPle1l6cQ=",
  // 下载后需要安装到哪些(相对于node_modules)
  "_location": "/eslint-config-airbnb-base",
  // 该模块的底层包要求
  "_phantomChildren": {},
  // 该模块安装时的限制信息
  "_requested": {
    "type": "version",
    "registry": true,
    // 元素信息
    "raw": "eslint-config-airbnb-base@14.2.0",
    // 模块名
    "name": "eslint-config-airbnb-base",
    // 模块名编码后的内容
    "escapedName": "eslint-config-airbnb-base",
    // 原始版本要求
    "rawSpec": "14.2.0",
    "saveSpec": null,
    // 最终获取的版本情况
    "fetchSpec": "14.2.0"
  },
  // 当前模块的上游有哪些
  "_requiredBy": [
    "/eslint-config-airbnb"
  ],
  // 该模块的位置
  "_resolved": "http://registry.npm.taobao.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz",
  // 版本要求
  "_spec": "14.2.0",
  // 该包需要安装到哪里(到项目级别的绝对路径)
  "_where": "/Users/hby/Desktop/test/my_test",
  // 作者信息,只能有一个,可以配置姓名,邮箱以及地址
  "author": {
    "name": "Jake Teton-Landis",
    "url": "https://twitter.com/@jitl"
  },
  // 接收问题反馈的url地址,支持email地址,一般是GitHub项目下的issue
  "bugs": {
    "url": "https://github.com/airbnb/javascript/issues"
  },
  // 贡献值信息,支持多个,支持配置的字段和author相同
  "contributors": [
    {
      "name": "Jake Teton-Landis",
      "url": "https://twitter.com/jitl"
    },
    {
      "name": "Jordan Harband",
      "email": "ljharb@gmail.com",
      "url": "http://ljharb.codes"
    },
    {
      "name": "Harrison Shoff",
      "url": "https://twitter.com/hshoff"
    }
  ],
  // 当前包所依赖的包名及对应的版本
  "dependencies": {
    "confusing-browser-globals": "^1.0.9",
    "object.assign": "^4.1.0",
    "object.entries": "^1.1.2"
  },
  // 包描述,有利于npm search的时候搜索到这个包
  "description": "Airbnb's base JS ESLint config, following our styleguide",
  // bundledDependencies: Array<string> 发布包时需要打包的依赖
  // 开发时所依赖的包,即别人用这边包时,不需要安装下面的这些包
  "devDependencies": {
    "@babel/runtime": "^7.8.7",
    "babel-preset-airbnb": "^4.5.0",
    "babel-tape-runner": "^3.0.0",
    "eclint": "^2.8.1",
    "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0",
    "eslint-find-rules": "^3.5.0",
    "eslint-plugin-import": "^2.21.2",
    "in-publish": "^2.0.1",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.0.1"
  },
  // 项目运行的node版本要求
  "engines": {
    "node": ">= 6"
  },
  // files: Array<string> 代表 npm publish后推送到npm服务器的文件列表
  // 首页地址,一般是GitHub项目地址下的README.md
  "homepage": "https://github.com/airbnb/javascript",
  // 关键词,同样有利于npm search
  "keywords": [
    "eslint",
    "eslintconfig",
    "config",
    "airbnb",
    "javascript",
    "styleguide",
    "es2015",
    "es2016",
    "es2017",
    "es2018"
  ],
  // 当前包所使用的许可证
  "license": "MIT",
  // 项目的入口文件,通常是项目的启动文件
  // 别人在项目中引入包时,其实就是引入了该字段对应的文件
  "main": "index.js",
  // 包名,长度需<=214字符,不能以.或_开头,不能用大写字母(具有唯一性)
  // 由于该字段会用作url的一部分、文件夹名称以及命令行参数,因此不能含有对url不安全的字符
  "name": "eslint-config-airbnb-base",
  // 指定所需要兼容的宿主包的版本
  "peerDependencies": {
    "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0",
    "eslint-plugin-import": "^2.21.2"
  },
  // 项目源码位置,type代表版本控制系统的类型,常用的有git和svn
  "repository": {
    "type": "git",
    "url": "git+https://github.com/airbnb/javascript.git"
  },
  // 支持的脚本命令,具体可参考https://docs.npmjs.com/cli/v6/using-npm/scripts
  "scripts": {
    "lint": "eslint --report-unused-disable-directives .",
    "posttravis": ":",
    "prelint": "eclint check * rules/* test/*",
    "prepublish": "(in-install || eslint-find-rules --unused) && (not-in-publish || npm test) && safe-publish-latest",
    "pretest": "npm run --silent lint",
    "pretests-only": "node ./test/requires",
    "pretravis": ":",
    "test": "npm run --silent tests-only",
    "tests-only": "babel-tape-runner ./test/test-*.js",
    "travis": "npm run --silent tests-only"
  },
  // 包版本
  "version": "14.2.0"
}

关于package.json中模块安装元信息部分的内容,纯属个人理解,如果有小伙伴们有准确的描述,欢迎提出~~~