作者:KostasBariotis-为什么lock.json很重要以及如何将其与NPMCLI一起使用。历史NPMv5引入了package-lock.json作为一种机制来捕获在任何时间点安装的确切依赖树。这有助于在不同环境中进行协作,在这种情况下,您希望每个人都获取项目特定版本的依赖项以获得相同的依赖项树。package.json使用语义版本控制定义所需的依赖项及其各自的版本。但是语义版本控制可能很棘手。考虑表示为"express":"^4.16.4"的依赖项。此模块的发布者(不使用package-lock.json)将安装Express4.16.4版,因为他们安装了最新版本。如果在我下载该模块并尝试安装依赖项时发布了新版本的express,我可以下载最新版本。这些信息插入符号可以准确地告诉我们。上面的问题是,如果4.17.x版本存在错误,我的本地设置将失败,但发布者的版本将继续在旧版本上正常工作。同样的事情可能发生在生产环境中,而你不知道为什么会失败。在NPMv5之前,您需要使用shrinkwrap。它与package-lock.json的不同之处在于它可以与模块一起发布到NPM注册表,而package-lock.json则不能。如果NPM+5对所有成员可用,最好对未发布的项目使用package-lock.json。但是,如果您正在开发一个模块并打算分发它,您需要考虑是否希望客户端安装您指定的确切依赖树,或者您是否希望更加灵活。这是该主题的更详细版本。因此,package-lock.json将描述当前安装的确切依赖树。NPM文档中描述了该格式。通过将它提交给你的VCS(你绝对应该这样做),你可以回到历史并复制确切的依赖关系树。确保始终将package-lock.json提交到您的VCS以在任何给定时间跟踪确切的依赖关系树。它将确保所有下载您的项目并尝试安装依赖项的客户端都获得完全相同的依赖项树。这也确保您可以检查以前的提交并复制每个提交的依赖状态。package.json和package-lock.json确保不要直接更改package-lock.json。这将由NPM自动处理。它会将package.json的更改反映到package-lock.json并保持最新。但这只有在使用NPM的CLI进行更改时才会发生。如果您手动更改package.json,请不要期望package-lock.json会更新。始终使用CLI命令,如安装、卸载等。如何使用NPMCLI当您第一次在新项目中使用NPM时,它会自动生成一个package-lock.json。然后就可以正常使用npm了。npminstall(以特定模块作为参数)可以使用install和要安装的模块的名称,这将更改package.json和package-lock.json,因为依赖树将更改。考虑以下示例:npminstallexpressbody-parsercorsnpminstall(withoutarguments)install将尝试安装与package-lock.json相关的所有依赖项。这里的关键是如果安装注册已经过期,package-lock.json是可以更改的。如果有人手动更改package.json(例如,他们删除了一个包,因为它只删除了一行),那么下次有人运行npminstall时,它将更改package-lock.json以反映先前包的删除。这可能很棘手。想象一下拉取一个项目的最新版本,当你运行npminstall获取最新信息时,你发现树上做了很多无意义的改动。树中的更改很可能对审查您的代码更改的人没有意义。npmuninstall类似于install,但将要删除的模块的名称作为参数。这将同时更改package.json和package-lock.json。npmupdateupdate将读取package.json以查找所有可以更新的依赖项。然后它将构建一个新的依赖树并更新package-lock.json。还记得语义版本控制吗?假设我们在package.json中有一个状态为^1.4.5的依赖项。字符^告诉NPM检查1.X.X范围内的更新版本,如果有则安装它。同样,~字符只会出现在修补程序或1.4.X上。您还可以省略特殊字符并保留固定版本,这会降低package-lock.json的帮助(但并非无用)。npmcici会安装package-lock.json相关的所有依赖,类似于install。这里的主要区别是package-lock.json在任何情况下都不会更改。它旨在用于某些环境,例如在构建服务器时以自动方式安装等。结论使用package-lock.json时,请记住这个关键要点:不要使用没有参数的npminstall来获取依赖项,所以改用npmci。您可以使用npminstall安装特定的依赖项。仅当您需要本地依赖树时,才在任何地方使用npmci,即使在您的本地开发环境中也是如此。为你的依赖项的更新做一个循环任务,例如每月一次。(或者,您可以使用像dependabot这样的服务,但要确保您有良好的测试覆盖率)。这样,您可以确保您的依赖项是最新的并避免技术债务。更多参考npminstall和npmci的区别:https://stackoverflow.com/que...NPMCLI源码:https://github.com/npm/cli/bl...语义版本控制:https://blog.npmjs.org/post/1…
