Câu trả lời:
Nó lưu trữ một cây phụ thuộc chính xác, được phiên bản thay vì sử dụng phiên bản được gắn dấu sao như chính gói.json (ví dụ: 1.0. *). Điều này có nghĩa là bạn có thể đảm bảo sự phụ thuộc cho các nhà phát triển hoặc phát hành prod khác, v.v. Nó cũng có một cơ chế để khóa cây nhưng thường sẽ tạo lại nếu gói.json thay đổi.
Từ các tài liệu npm :
gói-lock.json được tạo tự động cho bất kỳ hoạt động nào trong đó npm sửa đổi cây node_modules hoặc pack.json. Nó mô tả cây chính xác đã được tạo, sao cho các lần cài đặt tiếp theo có thể tạo các cây giống hệt nhau, bất kể cập nhật phụ thuộc trung gian.
Tập tin này được dự định cam kết vào kho lưu trữ nguồn và phục vụ các mục đích khác nhau:
Mô tả một đại diện duy nhất của cây phụ thuộc sao cho đồng đội, triển khai và tích hợp liên tục được đảm bảo để cài đặt chính xác các phụ thuộc giống nhau.
Cung cấp một phương tiện để người dùng "du hành thời gian" đến các trạng thái trước đó của node_modules mà không phải cam kết chính thư mục đó.
Để tạo điều kiện cho tầm nhìn thay đổi cây lớn hơn thông qua các điều khiển nguồn khác nhau có thể đọc được.
Và tối ưu hóa quá trình cài đặt bằng cách cho phép npm bỏ qua các độ phân giải siêu dữ liệu lặp lại cho các gói được cài đặt trước đó. "
Để trả lời câu hỏi của jrahhali dưới đây về việc chỉ sử dụng gói.json với số phiên bản chính xác. Hãy nhớ rằng gói.json của bạn chỉ chứa các phụ thuộc trực tiếp của bạn, không phụ thuộc vào các phụ thuộc của bạn (đôi khi được gọi là các phụ thuộc lồng nhau). Điều này có nghĩa là với gói.j.j tiêu chuẩn, bạn không thể kiểm soát các phiên bản của các phụ thuộc lồng nhau đó, tham chiếu chúng trực tiếp hoặc phụ thuộc ngang hàng sẽ không giúp ích vì bạn cũng không kiểm soát dung sai phiên bản mà phụ thuộc trực tiếp của bạn xác định cho các phụ thuộc lồng nhau này .
Ngay cả khi bạn khóa các phiên bản của phụ thuộc trực tiếp, bạn không thể đảm bảo 100% rằng cây phụ thuộc đầy đủ của bạn sẽ giống hệt nhau mỗi lần. Thứ hai, bạn có thể muốn cho phép các thay đổi không phá vỡ (dựa trên phiên bản ngữ nghĩa) của các phụ thuộc trực tiếp, điều này cho phép bạn kiểm soát các phụ thuộc lồng nhau ít hơn cộng với bạn một lần nữa không thể đảm bảo rằng các phụ thuộc trực tiếp của bạn sẽ không phá vỡ quy tắc phiên bản ngữ nghĩa chúng tôi.
Giải pháp cho tất cả điều này là tệp khóa như được mô tả ở trên khóa trong các phiên bản của cây phụ thuộc đầy đủ. Điều này cho phép bạn đảm bảo cây phụ thuộc của mình cho các nhà phát triển khác hoặc cho các bản phát hành trong khi vẫn cho phép thử nghiệm các phiên bản phụ thuộc mới (trực tiếp hoặc gián tiếp) bằng cách sử dụng gói.j.j tiêu chuẩn của bạn.
Lưu ý Json thu nhỏ trước đó đã làm khá nhiều điều tương tự nhưng tập tin khóa đổi tên nó để chức năng của nó rõ ràng hơn. Nếu đã có một tệp thu nhỏ trong dự án thì nó sẽ được sử dụng thay cho bất kỳ tệp khóa nào.
package-lock.jsontin đang được cập nhật mỗi khi bạn gọi cài đặt npm kể từ NPM 5.1. (thay đổi trong github.com/npm/npm/issues/16866 , ví dụ trong github.com/npm/npm/issues/17979 ) Do đó, nó không còn có thể được sử dụng để đặt cùng một phiên bản cho tất cả các nhà phát triển , trừ khi bạn chỉ định các phiên bản chính xác như 1.2.3thay vì 1.2.*trong package.jsontập tin của bạn .
npm cinhư npm installsẽ cập nhật gói-lock.json trong khi ci sử dụng nội dung của nó. Chỉ với npm cibạn sẽ có được các bản dựng mạnh mẽ có thể lặp lại.
Đây là một cải tiến rất quan trọng đối với npm: đảm bảo chính xác cùng một phiên bản của mọi gói .
Làm thế nào để đảm bảo dự án của bạn được xây dựng với cùng các gói trong các môi trường khác nhau trong một thời gian khác nhau? Giả sử, bạn có thể sử dụng ^1.2.3trong package.jsonhoặc một số phụ thuộc của bạn đang sử dụng theo cách đó, nhưng làm thế nào bạn có thể đảm bảo mỗi lần npm installsẽ nhận cùng một phiên bản trong máy dev của bạn và trong máy chủ xây dựng? gói-lock.json sẽ đảm bảo rằng.
npm installsẽ tạo lại tệp khóa, khi trên máy chủ xây dựng hoặc máy chủ triển khai, sẽ làm npm ci(sẽ đọc từ tệp khóa và cài đặt toàn bộ cây gói)
package-lock.jsontệp. Nó chỉ cài đặt từ package.jsonnhư trước đây. Để sử dụng package-lock.jsontệp, bạn phải sử dụng lệnh "npm ci" mới, sẽ cài đặt các phiên bản chính xác được liệt kê trong package-lock.jsonthay vì phạm vi phiên bản được đưa ra package.json.
npm install không đọc từ package-lock.json. Để tái sản xuất, làm như sau. sử dụng npm installgói.json này, chạy {... "devDependencies": {"sinon": "7.2.2"}} Bây giờ sao chép / dán package.jsonvà package-lock.jsonvào một thư mục mới. Thay đổi package.jsonthành: "sinon": "^ 7.2.2" chạy npm install. npm đọc từ gói-lock.json và cài đặt 7.2.2 thay vì 7.3.0. Nếu không có gói-lock.json, 7.3.0 sẽ được cài đặt.
package-lock.json, cách hợp lý duy nhất để làm điều đó là xóa package-lock.jsonvà tạo lại nó bằng cách sử dụng npm install. (Bạn không muốn chỉnh sửa thủ công package-lock.json). Thay đổi giá trị của "phiên bản" tài sản (gần đầu) của package.jsonsẽ thay đổi giống nhau ở package-lock.jsontrên npm install, nhưng thêm một dấu nháy đến một sự phụ thuộc sẽ không làm như vậy để package-lock.json.
package.jsonmột cái gì đó mà bạn có thể sửa đổi bằng tay, và package-lock.jsonnhư một cái gì đó mà bạn không bao giờ chạm vào bằng tay. Phiên bản bạn luôn kiểm soát các tệp BÓNG - đặc biệt package-lock.json. Mở cả hai tệp, chỉnh sửa thủ công tên dự án package.json, chạy npm installvà xem cách tên dự án thay đổi package-lock.json. licensedường như không được ghi lại trong package-lock.json.
npm ci, npm installsẽ chỉ sử dụng gói.json, mặc dù tệp khóa được cung cấp
package-lock.jsonđược ghi vào khi một giá trị số trong thuộc tính, chẳng hạn như thuộc tính "phiên bản" hoặc thuộc tính phụ thuộc được thay đổi package.json.
Nếu các giá trị số này trong package.jsonvà package-lock.jsonkhớp, package-lock.jsonđược đọc từ.
Nếu các giá trị số này trong package.jsonvà package-lock.jsonkhông khớp, package-lock.jsonđược ghi với các giá trị mới đó và các sửa đổi mới như dấu mũ và dấu ngã nếu chúng có mặt. Nhưng đó là con số đang kích hoạt sự thay đổi package-lock.json.
Để xem những gì tôi có ý nghĩa, làm như sau. Sử dụng package.jsonmà không có package-lock.json, chạy npm installvới:
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "7.2.2"
}
}
package-lock.json bây giờ sẽ có:
"sinon": {
"version": "7.2.2",
Bây giờ sao chép / dán cả hai tập tin vào một thư mục mới. Thay đổi package.jsonthành (chỉ thêm dấu mũ):
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.2.2"
}
}
chạy npm install. Nếu không có package-lock.jsontệp, sinon@7.3.0 sẽ được cài đặt. npm installđang đọc package-lock.json và cài đặt 7.2.2.
Bây giờ đổi package.jsonthành:
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.3.0"
}
}
chạy npm install. package-lock.jsonđã được viết cho , và bây giờ sẽ hiển thị:
"sinon": {
"version": "^7.3.0",
gói-lock.json được tạo tự động cho bất kỳ hoạt động nào trong đó npm sửa đổi cây node_modules hoặc pack.json. Nó mô tả cây chính xác đã được tạo, sao cho các lần cài đặt tiếp theo có thể tạo các cây giống hệt nhau, bất kể cập nhật phụ thuộc trung gian.
Nó mô tả một đại diện duy nhất của cây phụ thuộc sao cho đồng đội, triển khai và tích hợp liên tục được đảm bảo để cài đặt chính xác cùng các phụ thuộc. Nó chứa các thuộc tính sau.
{
"name": "mobileapp",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@angular-devkit/architect": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
"integrity": "sha512-2zi6S9tPlk52vyqNFg==",
"dev": true,
"requires": {
"@angular-devkit/core": "7.1.4",
"rxjs": "6.3.3"
}
},
}
Tập tin này được tự động tạo và sử dụng bởi npm để theo dõi các cài đặt gói của bạn và để quản lý tốt hơn trạng thái và lịch sử của các phụ thuộc dự án của bạn. Bạn không nên thay đổi nội dung của tập tin này.
pack-lock.json: Nó chứa các chi tiết phiên bản chính xác hiện đang được cài đặt cho Ứng dụng của bạn.