Vai trò của gói-lock.json là gì?


290

npm @ 5 đã được xuất bản, nó có một tệp tính năng gói-lock.json mới (sau npm install) làm tôi bối rối. Tôi muốn biết, ảnh hưởng của tập tin này là gì?

Câu trả lời:


289

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 đó. "

Biên tập

Để 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.


78
Nếu có một phiên bản chính xác của các phụ thuộc được tìm kiếm như vậy, tại sao không thực thi chỉ định phiên bản chính xác trong pack.json và từ bỏ tệp pack-lock.json?
jrahhali

15
@jrahhali - đã sửa đổi câu trả lời của tôi dựa trên câu hỏi của bạn.
Matt

1
Làm thế nào để cây phụ thuộc này từ pacakge.json.lock được áp dụng cho các nhà phát triển khác? Tự động?
stevek

40
Xin lưu ý rằng câu trả lời này không còn đúng nữa ! Tập 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 .
Christian

5
Bạn nên thêm một tham chiếu đế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.
k0pernikus

34

Đâ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)


9
Lưu ý rằng điều này là lỗi thời bây giờ. Trong 5.1.0 trở đi, "npm install" hoàn toàn không đọc từ 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.
Venryx

5
Tôi sợ Venryx không chính xác. 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.jsonpackage-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.
zumafra

2
Và không chỉ vậy, nhưng nếu bạn muốn làm một cái gì đó như thêm dấu mũ ^ vào 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.
zumafra

1
Hãy nghĩ về 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.
zumafra

2
@zumafra gói-lock.json sẽ được sử dụng khi thực hiện npm ci, npm installsẽ chỉ sử dụng gói.json, mặc dù tệp khóa được cung cấp
Xin

13

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.jsonpackage-lock.jsonkhớp, package-lock.jsonđược đọc từ.

Nếu các giá trị số này trong package.jsonpackage-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",

7

Một điều quan trọng cần đề cập là cải tiến bảo mật đi kèm với tệp khóa gói. Vì nó giữ tất cả các giá trị băm của các gói nếu ai đó can thiệp vào sổ đăng ký npm công khai và thay đổi mã nguồn của gói mà không thay đổi phiên bản của gói, nó sẽ được phát hiện bởi tệp khóa gói.


4

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"
  }
},

}


2

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.


1
Vậy chuyện gì xảy ra nếu tôi gặp mâu thuẫn với tập tin này?
Oliver Watkins

0

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.


1
Xin chào, và chào mừng. Câu hỏi này đã được trả lời. Bạn phải xác minh xem câu hỏi đã được đánh dấu là đã trả lời chưa, nếu có bất kỳ câu trả lời nào có dấu hiệu màu xanh lá cây phía trước nó.
Néstor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.