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.json
tin đ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.3
thay vì 1.2.*
trong package.json
tập tin của bạn .
npm ci
như npm install
sẽ cập nhật gói-lock.json trong khi ci sử dụng nội dung của nó. Chỉ với npm ci
bạ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.3
trong package.json
hoặ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 install
sẽ 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 install
sẽ 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.json
tệp. Nó chỉ cài đặt từ package.json
như trước đây. Để sử dụng package-lock.json
tệ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.json
thay 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 install
gói.json này, chạy {... "devDependencies": {"sinon": "7.2.2"}} Bây giờ sao chép / dán package.json
và package-lock.json
vào một thư mục mới. Thay đổi package.json
thà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.json
và 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.json
sẽ thay đổi giống nhau ở package-lock.json
trê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.json
một cái gì đó mà bạn có thể sửa đổi bằng tay, và package-lock.json
như 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 install
và xem cách tên dự án thay đổi package-lock.json
. license
dường như không được ghi lại trong package-lock.json
.
npm ci
, npm install
sẽ 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.json
và package-lock.json
khớp, package-lock.json
được đọc từ.
Nếu các giá trị số này trong package.json
và package-lock.json
khô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.json
mà không có package-lock.json
, chạy npm install
vớ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.json
thà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.json
tệ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.json
thà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.