资讯专栏INFORMATION COLUMN

关于package.json管理依赖包版本的详解

3403771864 / 171人阅读

  我们先说下,npm版本号定义

  版本格式:X.Y.Z[-string]其含义为:

  X:主版本号

  Y:次版本号

  Z:修正版本号

  string: 先行版本号或版本编译信息

  举个例子:

  6.3.2-alpha的含义为:

  主版本号6,有6次不可向下兼容的更新迭代。

  次版本号3,有3次小的功能迭代。6.*.* <=6.3.2的依赖声明,都可以安装此新包。

  修正版本号2,有2次bug修改或其他非重大功能的修改。6.*.* <=6.3.2的依赖声明,都可以安装此新包。

  先行版本号alpha,表示处理试验阶段。

  扩展阅读:语义化版本 2.0.0

  package.json怎么识别依赖版本

  现在我们看看具体的代码:

  "vue": "~2.5.22",
  "vue-class-component": "^6.0.0",
  "vue-router": "3.0.1",
  "express": "latest",
  "mongoose": "*",

  符号^:锁定主版本,可更新次版本号、修正版本号和先行版本号

  例如"vue-class-component": "^6.0.0",安装依赖时,可以安装符合6.*.* 的任意版本,只要主版本号是6即可。

  符号~:锁定主版本号和次版本号,可更新修正版本号和先行版本号

  例如"vue": "~2.5.22",安装依赖时,可以安装符合2.5.*的任意版本。

  空符号:锁定所有版本号

  例如"vue-router": "3.0.1",只能安装版本为3.0.1的依赖包。

  符号*:定义某个版本号范围

  例如vue-router": "3.0.*",可以安装3.0固定的任意版本,比如3.0.1、3.0.2。

  latest:安装最新的稳定版本

1.jpg

  例如"express": "latest",可以安装4.18.1 (2022.06.13最新版本)。

  *:安装最新发布的版本,不一定是稳定版本

2.jpg

  例如"mongoose": "*",可以安装6.0.0-rc2、3.9.7等。

  Git URL:使用Git上发布的包

  引用格式: <protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]

  "test": "git+ssh://git@github.com:npm/cli.git#v1.0.27"

  扩展阅读:npm docs - dependencies

  在这里要提醒下,请千万不必相信npm包的版本号,这样说就是血泪教训啊。  

  我们知道笔者在使用system.js时,使用的版本限制是:system.js: "^6.3.2"。

  在安装依赖的时候,意外安装了> 6.3.2的版本,导致项目运行出错。

  原因就是system.js作者,没有按照semver规范,进行版本号命名,导致笔者的项目,引入了不可向下兼容的更新,进而使项目运行出错。

  dependencies、devDependencies与peerDependencies

  dependencies

  生产环境中使用到的依赖,统一安装在dependencies下。

  举个例子:

  "dependencies": {
  "chalk": "^2.4.2",
  "commander": "^3.0.0",
  "fs-extra": "^8.1.0",
  "inquirer": "^6.5.0",
  "mem-fs": "^1.1.3",
  "mem-fs-editor": "^6.0.0",
  "shelljs": "^0.8.3"
  }

  在上面代码中,可以看到笔者做的cli工具包的package.json中的片段。

  shelljs用于操作文件,如果改在devDependencies声明,则用户安装当前工具包后,运行会报错。

  因为devDependencies字段声明的依赖,在npm install 工具包时,是不会安装的。

  必须在dependencies字段中声明,才会被安装。

  devDependencies

  生产环境不需要使用的依赖,都需要安装在peerDependencies下。

  因为生产环境下,是不会安装devDependencies字段下的依赖的。

  现在看看:

  "devDependencies": {
  "@commitlint/cli": "^8.1.0",
  "@commitlint/config-conventional": "^8.1.0",
  "commitizen": "^4.0.3",
  "commitlint-config-cz": "^0.12.1",
  "cz-customizable": "^6.2.0",
  "standard-version": "^7.0.0"
  }

  上述代码,是笔者做的cli工具包的package.json中的片段。

  commitizen是笔者用于规范Git提交规范的依赖包,只在开发环境中使用,所以在devDependencies中声明。

  peerDependencies

  当开发一些插件和工具包时,对使用方的运行环境的依赖包版本有要求,可以使用peerDependencies字段进行声明。

  举个例子:

  {
  "name": "tea-latte",
  "version": "1.3.5",
  "peerDependencies": {
  "tea": "2.x"
  }
  }

  当前工具tea-latte,依赖tea包。而且,要求tea包是主版本2。

  当不满足要求时,控制台会进行报错处理。

  注意

  npm v7版本, peerDependencies会默认安装。

  npm v3 到 npm v6版本,peerDependencies不会自动安装。

  参考

  npm Docs

  语义化版本 2.0.0

  本文关于package.json管理依赖包版本的详解已讲述完毕,欢迎大家关注更多后续精彩内容。


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128815.html

相关文章

  • npm常用命令及参数详解

    ...,主要记录一下NPM几个常用命令和参数意思 npm install packagename 安装模块如不指定版本号 默认会安装最新版本 npm install packagename 0.0.1 安装指定版本模块 npm init 这个命令会在当前目录生成一个package.json文件,这个文件中会...

    DevWiki 评论0 收藏0
  • Node.js知识点详解(一)基础部分

    ...块间发送消息会很耗性能 Node.js常用模块和组件 管理 Package Management: NPM 框架 Framework: ExpressJS 模板 Template: Jade 中间件 Middleware: Connect WebSocket: Socket.io 数据库 Database: Mongo DB (选了个自己喜欢) Mongoose (as a MongoDB ORM) ...

    whjin 评论0 收藏0
  • 你想知道关于package-lock.json一切,但是太害怕了问了?

    ...这是什么?用 npm 初始化项目会自动创建了一个新文件 package-lock.json。如果打开它,它看起来有点像 package.json 依赖项,但更冗长。我们决定忽略它,继续开发项目。最终,我们有时会遇到依赖问题,找不到,或者安装了...

    OBKoro1 评论0 收藏0
  • 深入浅出Node.js

    ...,其中参数--save-dev含义是代表把你安装信息写入package.json文件devDependencies字段中,安装在指定项目node_modules文件夹下。 局部安装意义:1、可以实现多个项目中使用不同版本;2、可以在不使用全局变量NODE_PAT...

    oujie 评论0 收藏0
  • 深入浅出Node.js

    ...,其中参数--save-dev含义是代表把你安装信息写入package.json文件devDependencies字段中,安装在指定项目node_modules文件夹下。 局部安装意义:1、可以实现多个项目中使用不同版本;2、可以在不使用全局变量NODE_PAT...

    MadPecker 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<