npm 5 was released today其中一项新功能包括通过创建package-lock.json
文件进行确定性安装。
这个文件应该保存在源代码管理中吗?
我假设它类似于yarn.lock
和composer.lock
,两者都应该保存在源代码管理中。
答案 0 :(得分:1170)
是的,package-lock.json
旨在检入源代码管理。如果你正在使用npm 5,你可以在命令行上看到这个:created a lockfile as package-lock.json. You should commit this file.
根据npm help package-lock.json
:
对于npm的任何操作,都会自动生成
package-lock.json
修改node_modules
树或package.json
。它描述了 生成的确切树,以便后续安装能够 无论中间依赖性更新如何,都会生成相同的树。此文件旨在提交到源存储库,并提供服务 各种用途:
描述依赖关系树的单一表示形式,以确保队友,部署和持续集成能够安装完全相同的依赖关系。
为用户提供“时间旅行”到
node_modules
之前状态的工具,而无需提交目录本身。通过可读的源代码控制差异,提高树木更改的可见性。
通过允许npm跳过以前安装的软件包的重复元数据解析来优化安装过程。
关于
package-lock.json
的一个关键细节是无法发布它 如果在toplevel包以外的任何地方找到,将被忽略。它分享 使用npm-shrinkwrap.json(5)的格式,它本质上是相同的文件,但是 允许出版。除非部署CLI工具或,否则不建议这样做 否则使用出版过程来制作生产包。如果
package-lock.json
和npm-shrinkwrap.json
都存在于根目录中 一个包,package-lock.json
将被完全忽略。
答案 1 :(得分:89)
是的,它是打算签入的。我想建议它获得自己独特的提交。我们发现它会给我们的差异增加很多噪音。
答案 2 :(得分:36)
是的,最佳做法是检入
我同意在看到差异时会引起很多噪音或冲突。但好处是:
^1.2.3
中使用package.json
,但是如何确保每次npm install
在开发计算机和构建服务器中获取相同版本,尤其是那些间接依赖包?那么,package-lock.json
将确保这一点。 (借助npm ci
安装基于锁文件的软件包)npm audit fix
(我认为审核功能来自npm版本6)。答案 3 :(得分:30)
我不在项目中提交此文件。有什么意义?
尽管的确,我从未在lib。的package.json中使用^,因为我对此有不好的经验:)
致谢。
答案 4 :(得分:24)
对于抱怨git diff时发出噪音的人:
git diff -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'
我所做的是使用别名:
alias gd="git diff --ignore-all-space --ignore-space-at-eol --ignore-space-change --ignore-blank-lines -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'"
要忽略整个存储库(每个使用它的人)在diffs中的package-lock.json,可以将其添加到.gitattributes
:
package-lock.json binary
yarn.lock binary
这将导致差异显示“每当更改包锁定文件时,二进制文件a / package-lock.json和b / package-lock.json都不同。此外,一些Git服务(特别是GitLab,但没有GitHub)在在线查看时,也会从差异中排除这些文件(不再更改1万行!)。
答案 5 :(得分:15)
是的,您可以提交此文件。来自npm's official docs:
package-lock.json
修改npm
树或node_modules
的任何操作都会自动生成
package.json
。它描述了生成的确切树,以便后续安装能够生成相同的树,无论中间依赖性更新如何。此文件旨在提交到源存储库[。]
答案 6 :(得分:2)
所有回答都表示“是”,但这也取决于项目,
关于package-lock.json的一个关键细节是它无法发布,如果在顶级软件包之外的任何地方都将被忽略。
这意味着您不需要在package-lock.json
的npm上发布依赖项,而是需要在仓库中使用package-lock.json
来锁定测试依赖项的版本,建立依赖项……>
但是,如果您使用lerna来管理具有多个软件包的项目,则应仅将package.json
放在仓库的根目录上,而不是在每个用npm init
创建的子软件包中。您会得到类似的东西:
.git
lerna.json
package.json
package-lock.json <--- here
packages/a/package.json
packages/a/lib/index.js
packages/b/package.json
packages/b/lib/index.js
答案 7 :(得分:1)
全局禁用package-lock.json
在终端中输入以下内容:
npm config set package-lock false
这真的像魔术一样对我有效
答案 8 :(得分:1)
我对npm的使用是生成缩小/缩小的css / js并生成django应用程序服务的页面中所需的javascript。在我的应用程序中,Javascript在页面上运行以创建动画,有时执行ajax调用,在VUE框架内工作和/或与CSS一起工作。如果package-lock.json对package.json中的内容具有某种压倒性的控制权,那么可能需要此文件有一个版本。以我的经验,它要么不会影响npm install所安装的内容,要么会影响到目前为止我所学的应用程序。我不使用mongodb或其他传统上是瘦客户端的应用程序。
我从回购中删除package-lock.json 因为npm install会生成此文件,并且npm install是运行该应用程序的每台服务器上部署过程的一部分。 node和npm的版本控制是在每台服务器上手动完成的,但是我要注意它们是相同的。
在服务器上运行npm install
时,它将更改package-lock.json,
如果服务器上的存储库记录了对文件的更改,则下一个部署WONT允许您从源中提取新更改。那是
您无法部署,因为请求将覆盖对package-lock.json所做的更改。
您甚至无法用存储库(重置硬原始主机)上的内容覆盖本地生成的package-lock.json,因为如果package-lock.json没有反映出npm,您每次发出命令时都会抱怨由于npm install,node_modules中有什么,从而破坏了部署。现在,如果这表明在node_modules中已安装了稍有不同的版本,则再也不会导致我出现问题。
如果node_modules不在您的仓库中(也不应该在仓库中),则应该忽略package-lock.json。
如果我缺少某些内容,请在评论中更正我,但是从该文件中获取版本控制这一点没有意义。文件package.json中包含版本号,我假设此文件是在npm install发生时用于构建软件包的文件,因为当我删除它时,npm install抱怨如下:
jason@localhost:introcart_wagtail$ rm package.json
jason@localhost:introcart_wagtail$ npm install
npm WARN saveError ENOENT: no such file or directory, open '/home/jason/webapps/introcart_devtools/introcart_wagtail/package.json'
并且构建失败,但是当安装node_modules或将npm应用于构建js / css时,如果删除package-lock.json不会发牢骚
jason@localhost:introcart_wagtail$ rm package-lock.json
jason@localhost:introcart_wagtail$ npm run dev
> introcart@1.0.0 dev /home/jason/webapps/introcart_devtools/introcart_wagtail
> NODE_ENV=development webpack --progress --colors --watch --mode=development
10% building 0/1 modules 1 active ...
答案 9 :(得分:1)
是的,您应该提交package-lock.json
。
我也极力建议在CI和本地开发计算机上构建应用程序时使用npm ci
而不是npm install
,并且工作流程需要存在{ {1}}。
package-lock.json
命令的最大缺点之一是它可能会突变npm install
,而package-lock.json
仅使用锁定文件中指定的版本,如果{{1 }}和npm ci
不同步。
因此,尤其是在本地运行package-lock.json
。在拥有多个开发人员的大型团队中,可能会导致package.json
内部发生许多冲突,开发人员决定改为完全删除npm install
。
然而,有一个强大的用例可以信任项目的依赖项在不同机器上以可靠的方式重复解决。
从package-lock.json
您可以确切地知道:一个已知的工作状态。
过去,我有没有package-lock.json
/ package-lock.json
/ package-lock.json
文件的项目,由于随机依赖项的最新更新,其构建有一天会失败。
这些问题很难解决,因为您有时不得不猜测上一个工作版本是什么。
如果要添加新的依赖项,则仍将运行npm-shrinkwrap.json
。如果要升级,请使用yarn.lock
并提交更改的npm install {dependency}
。 (如果升级失败,则可以恢复到上一个工作的npm update {dependency}
。)
强烈建议您将生成的包锁提交到 源代码控制:这将允许您团队中的其他人,您的 部署,您的CI /持续集成以及其他任何运行人员 在软件包源代码中安装npm以获得完全相同的依赖关系 您正在开发的树。此外,这些差异 更改是人类可读的,并且会通知您npm所做的任何更改 对您的node_modules做的,所以您可以注意到是否有任何传递 依赖项已更新,悬挂等。
关于difference between npm ci
vs npm install
:
- 项目必须具有现有的package-lock.json或npm-shrinkwrap.json。
- 如果包锁中的依赖项与package.json中的依赖项不匹配,则
package-lock.json
将退出并显示错误,而不是更新 包裹锁。package-lock.json
一次只能安装整个项目:此命令不能添加单个依赖项。- 如果已经存在
npm ci
,它将在npm ci
开始安装之前自动将其删除。- 它将永远不会写入
node_modules
或任何软件包锁:安装实际上是冻结的。
注意:我发布了类似的答案here
答案 10 :(得分:0)
是的,提交package-lock.json是一种标准做法
提交package-lock.json的主要原因是项目中的每个人都使用相同的软件包版本。
优点:-
项目中的每个人都将具有相同的软件包版本,您所要做的就是
npm install
如果您遵循严格的版本控制,并且不允许自动更新到主要版本,则可以避免第三方软件包向后不兼容的更改,从而避免提交软件包锁定。
缺点:-
答案 11 :(得分:0)
将 package-lock.json 提交到源代码版本控制意味着项目将使用特定版本的依赖项,该版本可能与 package.json 中定义的依赖项相匹配,也可能不匹配。如您所见,依赖项具有特定版本,没有任何插入符号 (^) 和波浪号 (~),这意味着依赖项不会更新到最新版本。并且 npm install 将选择与我们当前版本的 Angular 所需的相同版本。
注意:如果我在 CI 期间将任何插入符号 (^) 和波浪号 (~) 添加到要更新的依赖项,强烈建议将 package-lock.json 提交。