Bạn có thể có một cái gì đó như:
"typescript":"~2.1.6"
trong package.json
npm của bạn cập nhật lên phiên bản nhỏ mới nhất, trong trường hợp của bạn là2.4.1
Chỉnh sửa: Câu hỏi từ OP
Nhưng điều đó không giải thích tại sao "npm install" sẽ thay đổi tệp khóa. Không phải tập tin khóa có nghĩa là để tạo một bản dựng có thể lặp lại? Nếu vậy, bất kể giá trị semver, nó vẫn nên sử dụng cùng một phiên bản 2.1.6.
Câu trả lời:
Điều này nhằm khóa chặt cây phụ thuộc đầy đủ của bạn. Hãy nói typescript v2.4.1
yêu cầu widget ~v1.0.0
. Khi bạn npm cài đặt nó lấy widget v1.0.0
. Sau đó, nhà phát triển đồng nghiệp của bạn (hoặc bản dựng CI) thực hiện cài đặt npm và nhận typescript v2.4.1
nhưng widget
đã được cập nhật widget v1.0.1
. Bây giờ mô-đun nút của bạn không đồng bộ. Đây là những gìpackage-lock.json
ngăn chặn.
Hay nói chung hơn:
Ví dụ, xem xét
gói A:
{"name": "A", "phiên bản": "0.1.0", "phụ thuộc": {"B": "<0.1.0"}}
gói B:
{"name": "B", "phiên bản": "0.0.1", "phụ thuộc": {"C": "<0.1.0"}}
và gói C:
{"tên": "C", "phiên bản": "0.0.1"}
Nếu đây là các phiên bản duy nhất của A, B và C có sẵn trong sổ đăng ký, thì cài đặt npm bình thường A sẽ cài đặt:
A@0.1.0 - B@0.0.1 - C@0.0.1
Tuy nhiên, nếu B@0.0.2 được xuất bản, thì cài đặt npm mới A sẽ cài đặt:
A@0.1.0 - B@0.0.2 - C@0.0.1 giả sử phiên bản mới không sửa đổi các phụ thuộc của B. Tất nhiên, phiên bản mới của B có thể bao gồm một phiên bản C mới và bất kỳ số lượng phụ thuộc mới nào. Nếu những thay đổi như vậy là không mong muốn, tác giả của A có thể chỉ định một phụ thuộc vào B@0.0.1. Tuy nhiên, nếu tác giả của A và tác giả của B không phải là cùng một người, thì không có cách nào để tác giả của A nói rằng họ không muốn kéo theo các phiên bản C mới được xuất bản khi B hoàn toàn không thay đổi.
OP Câu hỏi 2: Vì vậy, hãy để tôi xem nếu tôi hiểu chính xác. Điều bạn đang nói là tệp khóa chỉ định các phiên bản của các phụ thuộc thứ cấp, nhưng vẫn dựa vào kết hợp mờ của pack.json để xác định các phụ thuộc cấp cao nhất. Điều đó có chính xác không?
Trả lời: Không. Khóa gói khóa toàn bộ cây gói, bao gồm các gói gốc được mô tả trong package.json
. Nếu typescript
bị khóa tại 2.4.1
của bạn package-lock.json
, nó sẽ vẫn như vậy cho đến khi nó được thay đổi. Và cho biết ngày mai typescript
phát hành phiên bản 2.4.2
. Nếu tôi kiểm tra chi nhánh của bạn và chạy npm install
, npm sẽ tôn trọng lockfile và cài đặt 2.4.1
.
Thêm về package-lock.json
:
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ùng các phụ thuộc.
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 đó.
https://docs.npmjs.com/files/package-lock.json