一天中的好时光。我阅读了 NPM 的文档,阅读了论坛,但我仍然不太明白这个文件的含义。
这是 npm 文档中描述的内容:
此文件旨在提交到源存储库,并用于各种目的:
1)描述依赖关系树的单一视图,以便保证部署项目的队友安装相同的依赖关系。
2)让用户能够“穿越”到 node_modules 的先前状态,而无需提交目录本身。
3)通过可读的源代码控制文本促进树中更改的更大可见性。
4)并通过允许 npm 跳过重复安装的包来简化安装过程。
问题马上就1分了,因为我package.json连package-lock.jsongit ignore都没有!他们忙碌。并且正如在同一个文档中所写的那样,当我们这样做时npm i,包管理器会安装package.json. 下载下一个库后,我们进入它并安装它的依赖项(如此递归)。在这个阶段,package-lock.json信息只是简单地显示了我们下载了哪些主要库的内部依赖。它如何帮助“保证安装相同的依赖项”?
这一切都从第 3 点开始。
嗯,我同意第4点,其实如果node_modules已经有这样的包(版本和hash相同),那么就不会安装了。但是,同样,这些信息不能通过 . 查看package-lock.json,而是在主包的依赖项中查看,因为几乎每个库都有一个内部package.json. 也就是说,我们不需要中间文件。
我是否正确理解了所有内容?请修复!
当你在 package.json 中写的时候
jQuery: "1.3.*",他用当前最大的数字代替星号的位置,例如 1.3.7,你把项目上传到 github,一年后有人下载到你的电脑上,按 npm i而且他是从网上下载的 1.3.9 是因为开发者已经上传了新版本,而你有不同的版本。看来证据是一样的,但是朋友有bug,而你没有bug。而解决方案就是在 git 中添加 node_modules,这是一个极其疯狂的决定。因此,node_modules 文件夹的简化快照,其中安装了所有 SPECIFIC 版本,这是包锁定文件。你只是不把 node_modules 推到 git 中,而是这个文件,当 Petya 编写 npm i 时,它会与你的版本完全相同,并且会从互联网上下载。
你的帽子)
另外,当你通过npm做一些操作的时候,如果有这个文件,节点就不需要运行node_modules和扫描安装了哪些版本,它只是使用package-lock作为数据库
除了依赖项,package.json还用于定义项目属性、描述、作者和许可信息、脚本,而package-lock.json仅用于将依赖项锁定到特定版本号。
项目中是否存在 package-lock.json 是可选的。此外,要禁用此文件的自动创建,您可以在.npmrc中写入package-lock=false
当重新安装固定版本的包时,结果
node_modules可能会有所不同,因为依赖关系可能会更新。为了实现确定性安装,npm使用一个package-lock.json明确描述所有依赖项的所有版本的文件。运行该命令时,
npm i安装程序会从安装程序中接收项目依赖项列表,package.json并在安装过程中更新package-lock.json,并在其中写入包含必要元信息的完整依赖项树。要从中安装软件包
package-lock.json,您需要使用另一个命令 -npm ci. 此命令安装所有依赖项,创建与上次执行时相同的依赖项树npm i。除了确定性之外,
npm ci它还可以很好地提高安装包的速度,因此它最常用于 CI 系统中。修复包版本是它的目的。
但是,使用该命令
npm install并不能保证安装与package-lock.json. 根据package.json包版本前面写的内容(我说的是符号~和^),包仍然会更新,但会根据已安装的更新package-lock.json自行修改。npm在自动项目构建和安装包(也在脚本编写期间自动CI)运行测试时,这种行为是非常不受欢迎的。有一个命令
npm ci。根据文档,在使用此命令安装软件包之前,项目文件夹
node_modules将被删除。