zoukankan      html  css  js  c++  java
  • 03-package.json 和 package-lock.json的作用和意义

    我们每次,去npm install xxx会把内容记录到package.json文件中,下载的包都会发生变化,为了系统的稳定性考虑,每次执行完npm install之后会对应生成package-lock文件,该文件记录了上一次安装的具体的版本号。

    根据官方文档,package-lock.json 是生成的系统当前安装的库的具体来源和版本号,锁定版本。

    当你执行npm install的时候, node会先从package.json文件中读取所有dependencies信息,然后根据dependencies中的信息与node_modules中的模块进行对比,没有的直接下载,node是从package.json文件读取模块名称,从package-lock.json文件中获取版本号,然后进行下载或者更新。

    当package.json与package-lock.json都不存在,执行"npm install"时,node会重新生成package-lock.json文件,然后把node_modules中的模块信息全部记入package-lock.json文件,但不会生成package.json文件。但是,你可以通过"npm init --yes"来生成package.json文件



    **自npm 5.0版本发布以来,npm i的规则发生了三次变化。**

    1、npm 5.0.x 版本,不管package.json怎么变,npm i 时都会根据lock文件下载

    package-lock.json file not updated after package.json file is changed · Issue #16866 · npm/npm

    这个 issue 控诉了这个问题,明明手动改了package.json,为啥不给我升级包!然后就导致了5.1.0的问题...

    2、5.1.0版本后 npm install 会无视lock文件 去下载最新的npm

    然后有人提了这个issue why is package-lock being ignored? · Issue #17979 · npm/npm

    控诉这个问题,最后演变成5.4.2版本后的规则。

    3、5.4.2版本后 why is package-lock being ignored? · Issue #17979 · npm/npm

    大致意思是,如果改了package.json,且package.json和lock文件不同,那么执行`npm i`时npm会根据package中的版本号以及语义含义去下载最新的包,并更新至lock。

    如果两者是同一状态,那么执行`npm i `都会根据lock下载,不会理会package实际包的版本是否有新。


    总结:

    package-lock.json文件是锁定当前项目依赖的小版本(具体哪个版本),及下载安装这个版本的源信息(如下载源),在node_modules中的对应关系,还有一个安装如果依赖了多个别的插件,也会把这种对应关系描述出来。当然了,我们压根也不会去看这些东西。

    package.json是安装的当前大版本的最新版本,因为是^开头,但是package.json中不建议固定写死具体某个版本号,因为它可能还有还有别的依赖,别的版本也都是^,你的这次版本固定可能下次别人更新就不行了,所以锁定版本有我们的lock文件去做。

    package.json中的某个,如果更新了(就是lock和package.json有差异了),那么lock里也会随着更新。但是lock里已经记录到了package.json中能正常运行项目的所有小版本依赖了,下次别人再npm i 安装依赖的时候,就会从lock锁定的这些信息中去安装项目依赖。

  • 相关阅读:
    IIS的各种身份验证详细测试
    HTTP Error 401.3 Unauthorized Error While creating IIS 7.0 web site on Windows 7
    C/S and B/S
    WCF ContractFilter mismatch at the EndpointDispatcher exception
    Configure WCF
    Inheritance VS Composition
    Unhandled Error in Silverlight Application, code 2103 when changing the namespace
    Java RMI VS TCP Socket
    Principles Of Object Oriented Design
    Socket处理发送和接收数据包,一个小实例:
  • 原文地址:https://www.cnblogs.com/haoqiyouyu/p/14542526.html
Copyright © 2011-2022 走看看