您可能有类似以下内容:
"typescript":"~2.1.6"
您将package.json
哪个npm更新为最新的次要版本,2.4.1
编辑:OP的问题
但这并不能解释为什么“ npm install”会更改锁定文件。锁定文件不是要创建可复制的版本吗?如果是这样,则无论semver值如何,都应仍使用相同的2.1.6版本。
回答:
这旨在锁定您的完整依赖关系树。假设typescript v2.4.1
require widget ~v1.0.0
。当您安装npm时,它会抓住widget v1.0.0
。稍后在您的其他开发人员(或CI构建)上进行npm安装并获取,typescript v2.4.1
但widget
已更新为widget v1.0.1
。现在,您的节点模块不同步。这是package-lock.json
防止的。
或更笼统地说:
例如,考虑
套餐A:
{“名称”:“ A”,“版本”:“ 0.1.0”,“依赖关系”:{“ B”:“ <0.1.0”}}
套餐B:
{“ name”:“ B”,“ version”:“ 0.0.1”,“ dependencies”:{“ C”:“ <0.1.0”}}
和包C:
{“ name”:“ C”,“ version”:“ 0.0.1”}
如果这些是注册表中可用的A,B和C的唯一版本,则将安装普通的npm install A:
A@0.1.0-B@0.0.1-C@0.0.1
但是,如果发布了B@0.0.2,则将安装新的npm install A:
A@0.1.0-B@0.0.2-C@0.0.1假设新版本未修改B的依赖关系。当然,新版本的B可以包括新版本的C和任何数量的新依赖项。如果不希望发生此类更改,则A的作者可以指定对B@0.0.1的依赖。但是,如果A的作者和B的作者不是同一个人,那么当B完全没有变化时,A的作者就无法说他或她不想插入新发布的C版本。
OP问题2:所以让我看看我是否理解正确。您要说的是,锁定文件指定了二级依赖关系的版本,但是仍然依赖于package.json的模糊匹配来确定顶级依赖关系。准确吗?
答:不。package-lock锁定整个软件包树,包括中描述的根软件包package.json
。如果typescript
锁定在2.4.1
中package-lock.json
,则应保持这种状态,直到更改为止。并说明天typescript
发布版本2.4.2
。如果我签出您的分支并运行npm install
,npm将遵守该锁文件并进行安装2.4.1
。
更多内容package-lock.json
:
对于npm修改node_modules树或package.json的任何操作,都会自动生成package-lock.json。它描述了生成的确切树,因此无论中间依赖项更新如何,后续安装都可以生成相同的树。
该文件旨在提交到源存储库中,并具有多种用途:
描述一个依赖关系树的单一表示,这样可以确保队友,部署和持续集成安装完全相同的依赖关系。
为用户提供一种便利,使其可以“时间旅行”到node_modules的先前状态,而不必提交目录本身。
为了通过可读的源代码控制差异更好地了解树的变化。
并允许npm跳过先前安装的软件包的重复元数据解析,从而优化安装过程。
https://docs.npmjs.com/files/package-lock.json