利用shrinkwrap锁定依赖版本

前言

对于web developer来说,代码依赖管理一直都是个头疼的问题。自前端代码模块化开发以来,前端依赖管理也从原始的手动加载维护演化为基于模块仓库和工具的自动管理。目前相对比较流行的包管理工具是bower和npm。

bower && npm

bower的完全面向web的包管理工具。本身并不存储模块代码,对包结构也无强制规范。安装的依赖默认存储在bower_components目录下,存储特点是扁平化的依赖结构,如果依赖库相互之间有版本冲突,bower会提示用户并让用户仲裁版本。
由于本身的设计缺陷无法满足复杂项目的构建需求,bower在社区也越来越不流行,但还有一些依赖只能通过bower安装(比如ember的一些库)。
npm起初是Node.js生态的包管理器,后来随着同构js库的发展,npm已经发展成了JavaScript生态的包管理器。npm模块遵循CommonJS规范,代码统一发布到npm仓库。安装的依赖存储在node_modules目录下,依赖采用树形结构存放,也就是同一个依赖可能会存在不同的版本,对于web开发者来说要注意代码冗余。

npm 锁定依赖版本

为此,npm提供了shrinkwrap命令来解决这个问题。在开发阶段依赖稳定后,运行如下命令:

npm shrinkwrap
npm shrinkwrap--dev//将dev-dependencies计算在内

  shrinkwrap会在根目录生成npm-shrinkwrap.json文件。之后的npm install会参照这个文件的版本来安装。

注意项

  1. shrinkwrap计算时是根据当前依赖安装的目录结构生成的,如果你不能保证package.json文件定义的依赖与node_modules下已安装的依赖是匹配、无冗余的,建议在执行shrinkwrap命令前清理依赖并重新安装(rm -rf node_modules && npm install)或精简依赖(npm prune)。
  2. 默认情况下,shrinkwrap只计算dependencies依赖,而不计算dev-dependencies,如果在生产环境也需要开发依赖或你的依赖分类不清晰,使用--dev参数生成shrinkwrap文件确保不会出问题。如果不需要关注dev-dependencies,建议npm install --production或npm prune --production

  3. 如果不需要关注dev-dependencies,建议npm install --production或npm prune --production

bower 锁定版本

bower官方并未提供该功能,这里提供下社区贡献的方案:bower-shrinkwrap-resolver

  1. npm install bower -g
  2. npm install bower-shrinkwrap-resolver -g
  3. 添加以下内容到.bowerrc:
{
  "resolvers": [
    "bower-shrinkwrap-resolver"
  ]
}

  之后执行bowerinstall,会自动生成bower-shrinkwrap.json文件。如果需要重新生成,执行bower install --reset-shrinkwrap

 

 

posted @ 2019-03-28 15:41  jameBo  阅读(258)  评论(0编辑  收藏  举报