npm 配置文件package.json/package-lock.json 的使用和版本控制

一,package.json

  1. 在 Node.js 中,模块是一个库或框架,也是一个 Node.js 项目。Node.js 项目遵循模块化的架构,当我们创建了一个 Node.js 项目,意味着创建了一个模块,这个模块的描述文件,被称为 package.json。

  2. package.json 属性说明:

    1. name - 包名;
    2. version - 包的版本号;
    3. description - 包的描述;
    4. homepage - 包的官网URL;
    5. dependencies / devDependencies - 生产/开发环境依赖包列表。它们将会被安装在 node_module 目录下;
    6. peerDependencies 对等依赖 参见:https://nodejs.org/en/blog/npm/peer-dependencies/
  3. 如何更新/下载 package.json 里的依赖包

    1. npm install -save moduleName 命令

      1. 安装模块到项目node_modules目录下。
      2. 会将模块依赖写入dependencies 节点。
      3. 运行 npm install 初始化项目时,会将模块下载到项目目录下。
      4. 运行npm install --production或者注明NODE_ENV变量值为production时,自动下载模块到node_modules目录中。

    2. npm install -save-dev moduleName 命令

      1. 安装模块到项目node_modules目录下。
      2. 会将模块依赖写入devDependencies 节点。
      3. 运行 npm install 初始化项目时,会将模块下载到项目目录下。
      4. 运行npm install --production或者注明NODE_ENV变量值为production时,不会自动下载模块到node_modules目录中。

    3. 拉取单个依赖最好后面加上你需要的版本号,如:npm install -save @angular/router@7.2.16

  4. 是否允许你的依赖自动更新

    1. '~'(波浪符号):他会更新到当前minor version(也就是中间的那位数字)中最新的版本。放到我们的例子中就是:"exif-js": "~2.3.0",这个库会去匹配更新到2.3.x的最新版本,如果出了一个新的版本为2.4.0,则不会自动升级。波浪符号是曾经npm安装时候的默认符号,现在已经变为了插入符号。
    2. '^'(插入符号): 这个符号就显得非常的灵活了,他将会把当前库的版本更新到当前major version(也就是第一位数字)中最新的版本。放到我们的例子中就是:"vue": "^2.2.2", 这个库会去匹配2.x.x中最新的版本,但是他不会自动更新到3.0.0。
    3. 不加 ^和~,表示不更新,是精确版本。

二,package-lock.json

  1. package-lock.json 是在 npm install 时候生成的一份文件,用以记录当前状态下实际安装的各个 npm package 的具体来源和版本号。package-lock.json 文件的作用锁定安装时的包的版本号,并且需要上传到 git,以保证其他人在 npm install 时大家的依赖能保证一致。
  2. 为什么需要把package-lock.json提交到gitlab
    1. package.json 文件只能锁定大版本,也就是版本号的第一位,并不能锁定后面的小版本,npm install 都是拉取的该大版本下的最新的版本,为了稳定性考虑我们几乎是不敢随意升级依赖包的,这将导致多出来很多工作量,测试/适配等,所以 package-lock.json 文件出来了,当你每次安装一个依赖的时候就锁定在你安装的这个版本。
    2. package-lock.json记录的是依赖树,记录了依赖模块之间的完整依赖关系。package.json记录的是依赖项,不能锁定依赖的依赖。

三,执行npm i (npm install)的时候,是如何执行package.json和package-lock.json的?

  1. 当你的项目里只有package.json时,node会先从package.json文件中读取所有dependencies信息,然后根据dependencies中的信息与node_modules中的模块进行对比,没有的直接下载,已有的检查更新,并生成package-lock.json。
    1. 下载和更新按照package.json 文件按照锁定情况,更新到大版本的最新小版。
  2. 当你的项目里既有package.json和package-lock.json时,node会从package.json里面读取模块名称,并从package-lock.json文件里找到对应的版本号,进行下载或者更新。
    1. 这里的下载和更新是指按照package.json 文件指定版本下载,不会更新到大版本的最新小版。
    2. 正因为有了package-lock.json文件锁定版本号,所以当你执行npm install的时候,node不会自动更新package.json文件中的模块,必须用npm install packagename(自动更新小版本号)或者npm install packagename@x.x.x(指定版本号)或者手动更改package.json来进行安装才会更新,package-lock.json文件中的版本号也会随着更新。
  3. 当package.json与package-lock.json都不存在,执行"npm install"时,node会重新生成package-lock.json文件,然后把node_modules中的模块信息全部记入package-lock.json文件,但不会生成package.json文件,此时,你可以通过"npm init --yes"来生成package.json文件。

四,版本控制

  1. 当多人同时修改package-lock.json的时候,有可能出现冲突,为了避免这种冲突,在我们执行npm install命令时,先拉取一下远程分支。
  2. 当出现冲突时,我们需要怎么解决?
    1. 如果冲突较少,建议手动解决。
    2. 如果冲突较多,可以通过手动修复任何package.json冲突然后npm install [--package-lock-only]重新运行来解决。参见:https://docs.npmjs.com/files/package-locks#resolving-lockfile-conflicts
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342