我们为什么需要lock文件

author author     2022-11-23     205

关键词:

前言

从 Yarn 横空出世推出 lock 文件以来,已经两年多时间了,npm 也在 5.0 版本加入了类似的功能,lock 文件越来越被开发者们接收和认可。本篇文章想从前端视角探讨一下我们为什么需要 lock 文件,以及它的一些成本与风险,当然其中一些观点对于后端也是适用的。

为什么需要 lock 文件

之所以需要 lock 文件,我觉得主要有 4 个原因:

确保各环境依赖版本的一致性

软件开发一般有着好几个环境,通常包括本地开发环境、集成测试环境、预发布环境以及线上环境。各环境依赖版本不一致通常是 bug 的一大来源,大家可能碰到过“在我的电脑上是好的”这种问题,也许就是依赖版本不一致导致的。这种问题通常很难定位,因为你很难确定到底是自己的问题还是依赖的问题。这也是 Yarn 推出 lock 文件的初衷之一,使用了 lock 文件,你在排查问题时至少可以排除依赖版本不一致这个因素。

语义化版本并不绝对可靠

一些开发者不愿意使用 lock 文件,一个主要原因是他们希望基于语义化版本号让依赖自动升级,认为只要选择的依赖可靠,大版本不变化就可以放心升级。在绝大多数情况下这么做不会有问题,但是也有意外情况,比如:

React 在 v16.4.0 对 getDerivedStateFromProps 的调用时机进行了调整。React 在 v16.3.0 引入了这个 API,最初只有在父组件引起的重渲染过程中会被调用,v16.4.0 调整为在所有渲染过程中都会被调用。如果你在不知情的情况下(自动)把 React 从 v16.3.0 升级到了 v16.4.0,那么极端情况下你的应用就会出问题。

虽然只有在很极端的情况下你才会碰到类似问题,但是这种问题本来就是不怕一万就怕万一。

可控的升级依赖

现在通过 webpack 把依赖单独提取为一个 vendor.js 是个很常见的做法,因为依赖变更相对来说没那么频繁,再配合上强缓存,可以做到即使发布了新版本,用户也可以使用缓存的 vendor.js 而不必重新下载。通常我们的应用不止一个依赖,这些依赖肯定也不是同一时间发布更新,如果不使用 lock 文件让其自由更新,可能会导致 vendor.js 缓存失效多次(每个依赖更新都会导致缓存失效)。如果使用 lock 文件就可以积累一段时间,让多个依赖集中更新,甚至跳过一些小版本更新,从而提高 vendor.js 的缓存命中率。

安全问题

几个月前 ESLint 发生了一个安全事故,一个攻击者窃取了 ESLint 维护者的 npm 账户,并发布了恶意版本的 eslint-scopeeslint-config-eslint(都是更新的小版本),其中前者是 babel-eslintwebpack 的依赖。如果没有使用 lock 文件,那么你就极有可能中招,ESLint 事后也建议开发者使用 lock 文件来避免自动安装新版本。

成本

使用 lock 文件自然会增加一点项目的维护成本,因为依赖不会再自动升级,所以需要项目维护者每隔一段时间手动进行升级。另外如果两个人同时修改了依赖,解决 lock 文件的冲突也是一件很麻烦的事。

但是手动升级依赖也有一些额外的好处,至少你升级每个依赖时都要去看一下它的 change log,这样可以对每一次升级做到心中有数,这也有助于你掌握依赖的发展趋势。比如前文提到的 React 的例子,只要你在升级时看一眼它的 change log,就很容易避开可能出现的问题。

风险

我唯一能想到的风险就是依赖版本固化问题,如果你使用了 lock 文件又没有花时间跟精力去维护它,那么你的项目就很容易陷入依赖版本固化的问题。如果太久没有升级依赖,你当前使用的版本跟最新版差别太大,升级就会很困难,考虑到现实成本问题,可能就永远不会升级了。

但是如果不使用 lock 文件就能完全避免这个问题吗,我想也不一定。不使用 lock 文件最多也只能在同一个大版本范围内自动升级,如果依赖升级了大版本,你没有花时间去升级,也会碰到同样的问题。只是相对于不使用 lock 文件,问题暴露的晚一些而已。

原文地址:https://segmentfault.com/a/1190000016914977

C#“lock”关键字:为啥语法需要对象?

...ck"keyword:Whyisanobjectnecessaryforthesyntax?C#“lock”关键字:为什么语法需要对象?【发布时间】:2014-09-2322:52:23【问题描述】:要将代码标记为关键部分,我们这样做:ObjectlockThis=newObject();lock(lockThis)//CriticalSection 查看详情

多线程之lock

...会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先 查看详情

java并发编程:lock

...会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronized 查看详情

java并发编程:lock

...会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronized的 查看详情

concurrent并发包-lock详解(转)

...问,那就是Lock。既然有了synchronized来实现线程同步,Java为什么还需要提供Lock呢?synchronized是Java的一个关键字,当我们使用synchronized 查看详情

了解 Gemfile.lock 文件

...在工作目录中创建。该文件中的指令是什么意思?例如,我们以下面的文件为例:PATHremote:.specs:gem_one(0.0.1)GEMremote:http://example.org/ 查看详情

为啥我的 yarn.lock 文件中有僵尸包?

...尸包?【英文标题】:Whyaretherezombiepackagesinmyyarn.lockfile?为什么我的yarn.lock文件中有僵尸包?【发布时间】:2021-07-1015:48:45【问题描述】:我们将所有应用程序部署为Docker容器,并且作为构建过程的一部分,通过容器扫描运行它... 查看详情

关于package.jsonpackage-lock.json和yarn.lock的安装问题

package.json是记录项目依赖包的版本文件。当我们新clone一个项目后,需要根据里面记载的信息下载对应的版本依赖到node_modules文件夹。package-lock.json,yarn.lock是保证项目包依赖版本稳定的安全文件。一般情况,用npm、... 查看详情

关于package.jsonpackage-lock.json和yarn.lock的安装问题

package.json是记录项目依赖包的版本文件。当我们新clone一个项目后,需要根据里面记载的信息下载对应的版本依赖到node_modules文件夹。package-lock.json,yarn.lock是保证项目包依赖版本稳定的安全文件。一般情况,用npm、... 查看详情

我们 Xcode 项目中的 podfile.lock 是啥,为啥要使用它?

...Xcodeprojectsandwhyisitused?我们Xcode项目中的podfile.lock是什么,为什么要使用它?【发布时间】:2017-07-2823:45:49【问题描述】:我是在Xcodeprojects中使用pod的初学者。我一直对podfile.lock感到困惑。我想将框架“OBJECTM 查看详情

lock锁-lock接口

本文从以下几个方面介绍Lock接口,分别从lock锁的介绍、为什么要用lock锁、方法介绍、可见性保证Lock接口简介  Lock锁是一种工具,用来控制对共享资源的访问。  Lock锁和Synchronized锁两者各个有各自的使用场景,lock并不是... 查看详情

为啥我们需要在 C# 中锁定和对象?

...C#中锁定和对象?【英文标题】:WhydoweneedtolockandobjectinC#?为什么我们需要在C#中锁定和对象?【发布时间】:2017-03-1913:10:32【问题描述】:这是我一直无法理解的。创建一个获得locked的虚拟对象几乎就像是一种黑客攻击,就像示... 查看详情

java线程安全lock

...synchronized做了优化,在性能上两种方式差距不大了。一、为什么出现lock  synchronized修饰的代码块,当一个线程获取了对应的 查看详情

java并发工具类lock和condition(代码片段)

...要知道,Java语言本身使用synchronized实现了管程的,那么为什么还在SDK中提供另外一种实现呢?欲知为何请看下文。下面将先阐述再造管程的理由,然后详细介绍Lock和Condition,最后再看实现同步机制时是选择synchronized还是SDK中的... 查看详情

为啥我们需要 qresource 文件?

...们需要qresource文件?【英文标题】:Whydoweneedqresourcefiles?为什么我们需要qresource文件?【发布时间】:2020-06-1521:21:44【问题描述】:为什么Qt似乎需要“资源文件”?我的意思是你用pyside2-rccresources.qrc-oresources.py编译的东西,例如... 查看详情

什么是稀疏文件,我们为什么需要它?

】什么是稀疏文件,我们为什么需要它?【英文标题】:Whatisasparsefileandwhydoweneedit?【发布时间】:2017-08-2421:41:24【问题描述】:我唯一能得到的是它是一个非常大的文件并且它很高效(以千兆字节为单位)。效率如何?【问题... 查看详情

java-lock简介

1.为什么会有Lock的出现  JDK5之前,我们一般都是通过synchronized来进行加锁操作,但synchronized是一种悲观锁,如果这个获取到锁的线程被阻塞了,但却没有释放锁,其他线程将只能一直无限期的等待着。而Lock可以实现其他线程... 查看详情

NuGet 锁定文件无法使用 --locked-mode 还原

...布时间】:2019-12-0108:15:19【问题描述】:Roslyn几年前给了我们deterministicbuilds。加上NuGetlockfiles,我们终于可以保证可重现的构建。我是lookingatthedocs,表示我可以选择加入--use-lock-file 查看详情