package.json确定依赖的范围,package-lock.json将这个范围精确到具体版本。主要是为了解决在各个环境中得到确定的node_modules,如果只依赖package.json因为该文件声明的是直接依赖的范围,它无法将直接依赖固定在某个特定版本,也无法声明依赖的依赖。所以需要引入package-lock.json文件来达到我们固定node_modules的目的。
npm7之后的版本生成的package-lock是可信的。
If you have a package.json and you run npm i we generate a package-lock.json from it.
If you run npm i against that package.json and package-lock.json, the latter will never be updated, even if the package.json would be happy with newer versions.
If you manually edit your package.json to have different ranges and run npm i and those ranges aren’t compatible with your package-lock.json then the latter will be updated with version that are compatible with your package.json. Further runs of npm i will be as with 2 above.
如果只有一个package.json并且执行了npm i 我们将会生成package-lock.json文件。
如果针对package.json和package-lock.json执行npm i,后者永远不会更新,即使package.json中依赖的包有更新的版本。
如果你手动编辑了package.json中依赖包版本到不同版本范围并且执行了npm i,并且这个版本范围和package-lock中的不兼容,之后会更新package-lock中的版本为兼容package.json内的版本。之后npm i的运行和上面两条的描述一致。
package-lock.json修改的原因 手动编辑package.json中依赖包后重新install。将项目依赖改为开发依赖,或者相反后重新install。npm registry 的修改后重新npm install,会引起package-lock.json文件中resolved字段的修改,即使包版本一致。新增、删除和更新包后重新install。 lock文件生成逻辑在包版本没有冲突的情况下会将依赖的依赖平铺,如果有冲突则会放到依赖的依赖内部。
例如:a 依赖 b,b 依赖 c,在node_modules中的结构是
|- a@1.0.0
|- b@1.0.0
|- c
如果项目依赖了b@2.0.0:
|- a@1.0.0
|—|-b@1.0.0
|- b@2.0.0
|- c
如果更新依赖,则依赖的依赖同样会更新。例如a发布了版本@1.0.1,b也发布了@1.0.1。npm install a@1.0.1则会变成
|- a@1.0.1
|—|-b@1.0.1
|- b@2.0.0
|- c
In short, the main differences between using npm install
and npm ci
are:
package-lock.json
or npm-shrinkwrap.json
.If dependencies in the package lock do not match those in package.json
, npm ci
will exit with an error, instead of updating the package lock.npm ci
can only install entire projects at a time: individual dependencies cannot be added with this command.If a node_modules
is already present, it will be automatically removed before npm ci
begins its install.It will never write to package.json
or any of the package-locks: installs are essentially frozen.想不必须存在package-lock.json文件或者npm-shrinkwrap.json文件如果如果package lock中的依赖和package.json中的依赖不匹配,npm ci将会报错退出,而不是更新package lock文件npm ci 只能一次安装一个项目:这个命令不能添加单独依赖如果node_modules文件夹已经提供,在npm ci 开始安装前它将会被自动移除该命令绝不会写package.json文件和如何package-locks文件:安装本质上是冻结的。
问题和解决方案
package-lock.json冲突怎么办?
从稳定的分支checkout package-lock.json,再重新npm install生成一份新的package-lock.json。
想回退package-lock.json中的依赖的依赖版本怎么办?在项目中直接install依赖的包对应的版本生成对应的lock文件,在将其从package.json中去除,即可将依赖的依赖版本进行回退。当然回退的版本是需要符合版本约束的。
参考我的package-lock.json被谁改了?
package-lock.json
About semantic versioning
npm-ci
package.json详解
npm 依赖管理中被忽略的那些细节
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)