Sự khác biệt giữa npm-shrwrap.json và gói-lock.json là gì?


158

Với việc phát hành npm @ 5 , giờ đây nó sẽ viết package-lock.jsontrừ khi npm-shrinkwrap.jsonđã tồn tại.

Tôi đã cài đặt npm @ 5 trên toàn cầu thông qua:

npm install npm@5 -g

Và bây giờ, nếu a npm-shrinkwrap.jsonđược tìm thấy trong:

npm install

một cảnh báo sẽ được in:

npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!

Vì vậy, mang đi của tôi là tôi nên thay thế thu nhỏ bằng package-lock.json.

Tuy nhiên, tại sao có một định dạng mới cho nó? Những gì có thể package-lock.jsonlàm mà npm-shrinkwrap.jsonkhông thể?

Câu trả lời:


176

Các tệp có cùng một nội dung, nhưng có một số khác biệt về cách npm xử lý chúng, được mô tả trên trang web tài liệu và trong tệp tài liệu trong repo npm bắt đầu bằng cách giải quyết rõ ràng sự khác biệt giữa hai tệp này :

  • package-lock.jsonkhông bao giờ được xuất bản đến npm, trong khi đó npm-shrinkwraptheo mặc định
  • package-lock.json các tệp không nằm trong gói cấp cao nhất bị bỏ qua, nhưng các tệp thu nhỏ thuộc các phụ thuộc được tôn trọng
  • npm-shrinkwrap.jsontương thích ngược với npm phiên bản 2, 3 và 4, trong khi package-lock.jsonchỉ được nhận ra bởi npm 5+

Bạn có thể chuyển đổi một hiện có package-lock.jsonsang một npm-shrinkwrap.jsonbằng cách chạy npm shrinkwrap.

Như vậy:

  • Nếu bạn không xuất bản gói của mình lên npm, sự lựa chọn giữa hai tệp này sẽ không có kết quả. Bạn có thể muốn sử dụng package-lock.jsonvì nó là mặc định và tên của nó rõ ràng hơn cho người mới bắt đầu npm; cách khác, bạn có thể muốn sử dụng npm-shrinkwrap.jsonđể tương thích ngược với npm 2-4 nếu bạn khó đảm bảo mọi người trong nhóm phát triển của bạn đều ở trên npm 5+. (Lưu ý rằng npm 5 đã được phát hành vào ngày 25 tháng 5 năm 2017; khả năng tương thích ngược sẽ ngày càng ít quan trọng hơn khi chúng ta nhận được thêm từ ngày đó, vì hầu hết mọi người cuối cùng sẽ nâng cấp.)
  • Nếu bạn đang xuất bản gói của mình lên npm, bạn có một lựa chọn giữa:

    1. sử dụng package-lock.jsonđể ghi lại chính xác phiên bản phụ thuộc nào bạn đã cài đặt, nhưng cho phép mọi người cài đặt gói của bạn sử dụng bất kỳ phiên bản phụ thuộc nào tương thích với phạm vi phiên bản được quy định bởi package.json, hoặc
    2. sử dụng một npm-shrinkwrap.jsonđể đảm bảo rằng tất cả mọi người cài đặt gói của bạn được chính xác cùng một phiên bản của tất cả phụ thuộc


    Quan điểm chính thức được mô tả (rất căng thẳng) trong các tài liệu là tùy chọn 1 nên được sử dụng cho các thư viện (có lẽ để giảm số lượng sao chép gói gây ra khi rất nhiều phụ thuộc của gói phụ thuộc vào các phiên bản hơi khác nhau của cùng một phụ thuộc thứ cấp) , nhưng tùy chọn 2 đó có thể hợp lý cho các tệp thực thi sẽ được cài đặt trên toàn cầu.


2
+1 - bạn có thể làm rõ điểm đạn thứ hai của mình không? Sự khác biệt giữa hành vi đó và có một npm-shrwrap là gì?
Rhys

2
@Rhys viên đạn thứ hai sẽ không thành vấn đề trong thực tế trừ khi bạn làm điều gì đó kỳ lạ. Về cơ bản, nó chỉ nói rằng nếu một thư viện bằng cách nào đó đã xuất bản một package-lock.json(điều đó là không thể), thì nếu bạn cài đặt thư viện đó như một sự phụ thuộc của một số gói khác, thì thư viện package-lock.jsonsẽ bị NPM bỏ qua. Tuy nhiên, nếu thư viện xuất bản npm-shrinkwrap.jsonvà bạn cài đặt thư viện dưới dạng phụ thuộc, thì bạn cũng sẽ cài đặt dưới dạng phụ thuộc thứ cấp phiên bản chính xác của tất cả các phụ thuộc được chỉ định trong thư viện npm-shrinkwrap.json.
Đánh dấu Amery

Bạn có thể vui lòng thêm nó npm citồn tại để đảm bảo cài đặt package-lock.jsondưới dạng chỉ đọc. ( npm installđột biến package-lock.jsongây ra sự nhầm lẫn và các lỗi tiềm ẩn và không tận dụng lợi thế của mọi người package-lock.json.)
k0pernikus

@ k0pernikus Tôi không nghĩ có sự khác biệt nào giữa cách npm cixử lý npm-shrinkwrap.jsonpackage-lock.json- mức độ liên quan của câu hỏi này về sự khác biệt giữa hai tệp? Ngoài ra, sau khi đọc xung quanh: Tôi nghĩ rằng " npm install... không tận dụng lợi thế package-lock.json" đã sai từ npm 5.4 - Tôi tin rằng npm installbây giờ tôn trọng bạn package-lock trừ khi nó hoàn toàn không tương thích với bạn package.json, trong trường hợp sau đó sẽ được ưu tiên. (Nhưng tôi đã rời khỏi thế giới JavaScript một chút - tôi có thiếu điều gì không?)
Mark Amery

27

Giải thích từ Nhà phát triển NPM :

Ý tưởng chắc chắn là gói-lock.json là công nghệ mới nhất và vĩ đại nhất trong công nghệ thu nhỏ và npm-shrwrap.json được dành riêng cho những người quý giá ngoài kia, những người quan tâm rất nhiều về thư viện của họ có một nút_modules chính xác - và đối với những người muốn CI sử dụng npm @> = 2 để cài đặt một cây cụ thể mà không cần phải nâng cấp phiên bản npm của nó.

Lockfile mới ("gói-lock.json") về cơ bản chia sẻ tất cả cùng một mã, định dạng chính xác giống như npm-shrwrap (bạn có thể đổi tên chúng giữa nhau!). Đó cũng là điều mà cộng đồng dường như hiểu: "nó có khóa" dường như nhấp nhanh hơn rất nhiều với mọi người. Cuối cùng, có một tệp mới có nghĩa là chúng ta có thể có tương thích ngược có rủi ro tương đối thấp với bản thu nhỏ mà không phải làm những việc kỳ lạ như cho phép xuất bản được đề cập trong bài đăng phụ huynh.


18
Tôi vẫn chưa rõ về sự khác biệt. Nếu npm-shrinkwraplà cho node_modules chính xác .... Tôi giả sử package-lock.jsonlà khóa ít hơn chính xác? Và nếu vậy, cái gì không khóa mà npm-shrinkwraplà khóa?
dman

bạn đã hiểu sai @dman. gói-khóa là phiên bản mới của npm-shrwrap. khóa gói là từ chối (vì vậy bạn phải xóa tính năng này vì nó được bật mặc định), npm-shrwrap là chọn tham gia (vì vậy bạn phải bật tính năng này vì nó không bao gồm mặc định của tôi). lý do tại sao họ giới thiệu khóa gói là vì 1. người dùng hiện có một cách tiết kiệm hơn để xử lý các phụ thuộc bởi vì nó được bật theo mặc định và 2. tên này ngụ ý nó nằm đối diện với "thu nhỏ". npm-shrwrap có một số cài đặt hành vi phụ thuộc đặc biệt mà khóa gói hiện không có. npm-shrwrap hiện đã lỗi thời.
Nghiêm túc

10
điều này là không đúng. Bằng cách nói rằng gói khóa là phiên bản mới của npm-shrwrap, bạn đang nói nó là một sự thay thế. npm-shrwrap không bị phản đối và có sự khác biệt với gói-lock.json. Hơn nữa, gói-lock.json có lỗi trong khi npm-shrwrap không ... do đó nhấn mạnh nhiều hơn để chúng không cùng mã.
dman

Ngoài ra gói-lock.json là xâm nhập. Vì vậy, nó có thể dễ dàng gây ra xung đột scm nếu bạn gọi "npm i" trong khi thu nhỏ sẽ được tạo rõ ràng và sẽ không gây ra xung đột trên các máy chủ ci. Vâng, tôi có thể sai ở đây.
norekhov

@dman "gói-lock.json có lỗi trong khi npm-shrwrap thì không" - không, không. Không có dấu hiệu nào cho thấy vấn đề bạn liên quan đến; nó thậm chí không đề cập đến npm-shrinkwrap. Như tôi lưu ý trong câu trả lời của mình, việc chuyển đổi một package-lock.jsonthành một npm-shrinkwrap.jsonnghĩa đen chỉ được thực hiện bằng cách đổi tên tệp; chúng "cùng một mã".
Mark Amery

12

Tôi nghĩ rằng ý tưởng là có - mặc định và thu nhỏ xảy ra theo mặc định nhưng tránh bất kỳ vấn đề tiềm ẩn nào với một bản thu nhỏ xảy ra ở nơi nó không muốn. Vì vậy, họ chỉ đặt cho nó một tên tệp mới để tránh mọi xung đột. Ai đó từ npm đã giải thích kỹ hơn về vấn đề này ở đây:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_release_save_by_default_lockfile_better/di3mjuk/

Các trích dẫn có liên quan:

npm xuất bản hầu hết các tệp trong thư mục nguồn của bạn theo mặc định và mọi người đã xuất bản các bản thu nhỏ trong nhiều năm. Chúng tôi không muốn phá vỡ tính tương thích. Với --save và shrwrap theo mặc định, có nguy cơ lớn nó vô tình xâm nhập và truyền qua sổ đăng ký, và về cơ bản thể hiện khả năng của chúng tôi để cập nhật deps và khấu trừ ... null.

Vì vậy, chúng tôi đã chọn một tên mới. Và chúng tôi đã chọn một loại tên mới của một cách bất ngờ. Lockfile mới chia sẻ về cơ bản tất cả các mã giống nhau, cùng một định dạng

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.