Tại sao “npm install” viết lại package-lock.json?

643
Viper Bailey 2017-07-11 11:38.

Tôi vừa mới nâng cấp lên npm @ 5 . Bây giờ tôi có một tệp package-lock.json với mọi thứ từ package.json . Tôi hy vọng rằng, khi tôi chạy npm install, các phiên bản phụ thuộc sẽ được lấy từ tệp khóa để xác định những gì nên được cài đặt trong thư mục node_modules của tôi . Điều kỳ lạ là nó thực sự kết thúc việc sửa đổi và viết lại tệp package-lock.json của tôi .

Ví dụ: tệp khóa có chỉ định kiểu chữ ở phiên bản 2.1.6 . Sau đó, sau npm installlệnh, phiên bản được thay đổi thành 2.4.1 . Điều đó dường như đánh bại toàn bộ mục đích của một tệp khóa.

Tôi đang thiếu gì? Làm cách nào để npm thực sự tôn trọng tệp khóa của tôi?

11 answers

442
jotaen 2017-08-09 01:16.

Cập nhật 3: Như các câu trả lời khác cũng chỉ ra, npm cilệnh đã được giới thiệu trong npm 5.7.0 như một cách bổ sung để đạt được các bản dựng nhanh và có thể tái tạo trong ngữ cảnh CI. Xem tài liệublog npm để biết thêm thông tin.


Cập nhật 2: Vấn đề cần cập nhật và làm rõ tài liệu là GitHub issue # 18103 .


Cập nhật 1: Hành vi được mô tả bên dưới đã được khắc phục trong npm 5.4.2: hành vi dự kiến ​​hiện tại được nêu trong GitHub sự cố # 17979 .


Câu trả lời ban đầu: Hành vi của package-lock.jsonđã được thay đổi trong npm 5.1.0 như đã thảo luận trong vấn đề # 16866 . Hành vi mà bạn quan sát được rõ ràng là do npm kể từ phiên bản 5.1.0.

Điều đó có nghĩa là điều đó package.jsoncó thể ghi đè package-lock.jsonbất cứ khi nào tìm thấy phiên bản mới hơn cho phần phụ thuộc vào package.json. Nếu bạn muốn ghim các phần phụ thuộc của mình một cách hiệu quả, bây giờ bạn phải chỉ định các phiên bản không có tiền tố, ví dụ: bạn cần viết chúng dưới dạng 1.2.0thay vì ~1.2.0hoặc ^1.2.0. Sau đó, sự kết hợp của package.jsonpackage-lock.jsonsẽ tạo ra các bản dựng có thể tái tạo. Để rõ ràng: package-lock.jsonmột mình không còn khóa các phụ thuộc cấp gốc!

Quyết định thiết kế này có tốt hay không vẫn còn được tranh cãi, nhưng vẫn có một cuộc thảo luận đang diễn ra do sự nhầm lẫn này trên GitHub trong số 17979 . (Trong mắt tôi, đó là một quyết định đáng nghi ngờ; ít nhất thì cái tên lockđó không còn đúng nữa.)

Một lưu ý nhỏ nữa: cũng có một hạn chế đối với các đăng ký không hỗ trợ các gói không thay đổi, chẳng hạn như khi bạn kéo các gói trực tiếp từ GitHub thay vì npmjs.org. Xem tài liệu này về khóa gói để giải thích thêm.

174
Ivan Shcherbakov 2018-02-28 05:10.

Tôi đã tìm thấy rằng sẽ có một phiên bản mới của NPM 5.7.1 với lệnh mới npm ci, mà sẽ cài đặt từ package-lock.jsonchỉ

Lệnh npm ci mới CHỈ cài đặt từ tệp khóa của bạn. Nếu package.json và tệp khóa của bạn không đồng bộ thì nó sẽ báo lỗi.

Nó hoạt động bằng cách loại bỏ node_modules của bạn và tạo lại nó từ đầu.

Ngoài việc đảm bảo với bạn rằng bạn sẽ chỉ nhận được những gì có trong tệp khóa của mình, nó cũng nhanh hơn nhiều (2x-10x!) So với cài đặt npm khi bạn không bắt đầu với node_modules.

Như bạn có thể hiểu từ tên, chúng tôi kỳ vọng nó sẽ là một lợi ích lớn cho các môi trường tích hợp liên tục. Chúng tôi cũng hy vọng rằng những người làm sản xuất triển khai từ thẻ git sẽ thấy lợi nhuận lớn.

98
Gal Margalit 2018-06-27 04:59.

Sử dụng mới được giới thiệu

npm ci

npm ci hứa hẹn mang lại nhiều lợi ích nhất cho các đội lớn. Cung cấp cho các nhà phát triển khả năng “đăng xuất” trên một khóa gói thúc đẩy sự cộng tác hiệu quả hơn giữa các nhóm lớn và khả năng cài đặt chính xác những gì có trong một tệp khóa có khả năng tiết kiệm hàng chục nếu không phải hàng trăm giờ cho nhà phát triển mỗi tháng, giải phóng nhóm dành nhiều thời gian hơn để xây dựng và vận chuyển những điều tuyệt vời.

Giới thiệu npm cicác bản dựng nhanh hơn, đáng tin cậy hơn

76
Ahmad Abdelghany 2018-12-04 02:39.

Câu trả lời ngắn:

  • npm install chỉ tôn vinh package-lock.json nếu nó đáp ứng các yêu cầu của package.json.
  • Nếu nó không đáp ứng các yêu cầu đó, các gói sẽ được cập nhật và khóa gói sẽ bị ghi đè.
  • Nếu bạn muốn cài đặt không thành công thay vì ghi đè khóa gói khi điều này xảy ra, hãy sử dụng npm ci.

Đây là một tình huống có thể giải thích mọi thứ (Được xác minh với NPM 6.3.0)

Bạn khai báo một phụ thuộc trong package.json như:

"depA": "^1.0.0"

Sau đó, bạn thực hiện, npm installđiều này sẽ tạo ra một package-lock.json với:

"depA": "1.0.0"

Vài ngày sau, một phiên bản nhỏ hơn mới hơn của "depA" được phát hành, chẳng hạn như "1.1.0", thì điều sau đúng:

npm ci       # respects only package-lock.json and installs 1.0.0

npm install  # also, respects the package-lock version and keeps 1.0.0 installed 
             # (i.e. when package-lock.json exists, it overrules package.json)

Tiếp theo, bạn cập nhật thủ công package.json của mình thành:

"depA": "^1.1.0"

Sau đó chạy lại:

npm ci      # will try to honor package-lock which says 1.0.0
            # but that does not satisfy package.json requirement of "^1.1.0" 
            # so it would throw an error 

npm install # installs "1.1.0" (as required by the updated package.json)
            # also rewrites package-lock.json version to "1.1.0"
            # (i.e. when package.json is modified, it overrules the package-lock.json)
21
Daniel Tonon 2018-12-08 20:48.

Sử dụng npm cilệnh thay vì npm install.

"ci" là viết tắt của "liên tục tích hợp".

Nó sẽ cài đặt các phụ thuộc dự án dựa trên tệp package-lock.json thay vì các phụ thuộc tệp package.json khoan dung.

Nó sẽ tạo ra các bản dựng giống hệt nhau cho đồng đội của bạn và nó cũng nhanh hơn nhiều.

Bạn có thể đọc thêm về nó trong bài đăng trên blog này: https://blog.npmjs.org/post/171556855892/introductioning-npm-ci-for-faster-more-reliable

8
Timothy Higinbottom 2017-10-07 10:25.

Trong tương lai, bạn sẽ có thể sử dụng --from-lock-filecờ (hoặc tương tự) để chỉ cài đặt từ package-lock.jsonmà không cần sửa đổi nó.

Điều này sẽ hữu ích cho các môi trường CI, v.v. mà các bản dựng có thể tái tạo là quan trọng.

Xem https://github.com/npm/npm/issues/18286 để theo dõi tính năng.

8
Daniel Tonon 2017-09-30 11:55.

Có vẻ như sự cố này đã được khắc phục trong npm v5.4.2

https://github.com/npm/npm/issues/17979

(Cuộn xuống nhận xét cuối cùng trong chuỗi)

Cập nhật

Trên thực tế đã sửa trong 5.6.0. Có một lỗi nền tảng chéo trong 5.4.2 khiến sự cố vẫn xảy ra.

https://github.com/npm/npm/issues/18712

Cập nhật 2

Xem câu trả lời của tôi tại đây: https://stackoverflow.com/a/53680257/1611058

npm ci là lệnh bạn nên sử dụng khi cài đặt các dự án hiện có.

4
Matt 2017-07-11 11:45.

Bạn có thể có một cái gì đó như:

"typescript":"~2.1.6"

trong package.jsonđó npm 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 khóa nhằm tạo ra một bản dựng có thể tái tạo? Nếu vậy, bất kể giá trị semver là bao nhiêu, 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 mục đích khóa cây phụ thuộc đầy đủ của bạn. Hãy nói typescript v2.4.1yêu cầu widget ~v1.0.0. Khi bạn npm cài đặt nó sẽ 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 được typescript v2.4.1nhưng widgetđã được cập nhật lên 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.jsonngăn cản.

Hay nói chung:

Ví dụ, hãy xem xét

gói A:

{"name": "A", "version": "0.1.0", "dependencies": {"B": "<0.1.0"}}

gói B:

{"name": "B", "version": "0.0.1", "phụ thuộc": {"C": "<0.1.0"}}

và gói C:

{"name": "C", "version": "0.0.1"}

Nếu đây là các phiên bản A, B và C duy nhất có sẵn trong sổ đăng ký, thì bản cài đặt npm bình thường A sẽ cài đặt:

[email protected] - [email protected] - [email protected]

Tuy nhiên, nếu [email protected] được xuất bản, thì bản cài đặt npm mới A sẽ cài đặt:

[email protected] - [email protected] - [email protected] giả sử phiên bản mới không sửa đổi các phần phụ thuộc của B. Tất nhiên, phiên bản mới của B có thể bao gồm phiên bản mới của C 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 phụ thuộc vào [email protected] 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 các phiên bản mới xuất bản của C khi B vẫn chưa thay đổi.


OP Câu hỏi 2: Vậy để tôi xem tôi có hiểu đúng không. Những gì bạn đang nói là tệp khóa chỉ định 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 package.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. Package-lock sẽ khóa toàn bộ cây gói, bao gồm cả các gói gốc được mô tả trong package.json. Nếu typescriptbị khóa tại 2.4.1của bạn package-lock.json, nó sẽ vẫn như vậy cho đến khi nó được thay đổi. Và hãy nói rằng typescriptphiên bản phát hành ngày mai 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 tệp khóa và cài đặt 2.4.1.

Thêm về package-lock.json:

package-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 package.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 ra các cây giống hệt nhau, bất kể cập nhật phụ thuộc trung gian.

Tệp này được dự định đưa vào kho lưu trữ nguồn và phục vụ các mục đích khác nhau:

Mô tả một biểu diễn duy nhất của cây phụ thuộc sao cho các thành viên nhóm, 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 cần phải cam kết chính thư mục đó.

Để tạo điều kiện hiển thị rõ hơn các thay đổi của cây thông qua các khác biệt điều khiển nguồn 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ài đặt trước đó.

https://docs.npmjs.com/files/package-lock.json

3
Sengottaian Karthik 2020-02-15 03:56.

Có lẽ bạn nên sử dụng một cái gì đó như thế này

npm ci

Thay vì sử dụng npm install nếu bạn không muốn thay đổi phiên bản gói của mình.

Theo tài liệu chính thức, cả hai npm installnpm cicài đặt các phụ thuộc cần thiết cho dự án.

Sự khác biệt chính là, npm installcài đặt các gói lấy packge.jsonlàm tham chiếu. Trong trường hợp của npm ci, nó cài đặt các gói lấy package-lock.jsonlàm tham chiếu, đảm bảo mỗi khi gói chính xác được cài đặt.

1
hrdwdmrbl 2017-11-22 14:08.

Có một vấn đề mở cho vấn đề này trên trang github của họ: https://github.com/npm/npm/issues/18712

Vấn đề này nghiêm trọng nhất khi các nhà phát triển đang sử dụng các hệ điều hành khác nhau.

1
Bernardo Dal Corno 2017-11-15 14:54.

CHỈNH SỬA: tên "khóa" là một tên khó, NPM của nó đang cố gắng bắt kịp Yarn. Nó không phải là một tập tin bị khóa. package.jsonlà một tệp do người dùng cố định, sau khi được "cài đặt" sẽ tạo cây thư mục node_modules và cây đó sau đó sẽ được ghi vào package-lock.json. Vì vậy, bạn thấy đó, ngược lại - các phiên bản phụ thuộc sẽ được lấy từ package.jsonmọi khi và package-lock.jsonnên được gọi làpackage-tree.json

(hy vọng điều này làm cho câu trả lời của tôi rõ ràng hơn, sau rất nhiều phiếu phản đối)


Một câu trả lời đơn giản: package.jsoncó các phụ thuộc của bạn như bình thường, trong khi đó package-lock.jsonlà "một cây node_modules chính xác và quan trọng hơn có thể tái tạo" (lấy từ chính tài liệu npm ).

Đối với cái tên gian xảo, NPM của nó đang cố gắng bắt kịp Yarn.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Desiree Rogers, trái, và Cheryl Mayberry McKissack Chuyển sang, Fenty Beauty và Pat McGrath, có một đế chế làm đẹp mới do phụ nữ làm chủ đang trỗi dậy. Sau thương vụ mua lại mỹ phẩm Black Opal vào tháng 9, đội ngũ quyền lực của Giám đốc điều hành công ty Desiree Rogers và Chủ tịch Cheryl Mayberry McKissack đã thông báo mua lại thương hiệu làm đẹp tiên phong Fashion Fair từ người sáng lập Johnson Publishing Company (JPC).

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Đối với những người có quá nhiều thời gian, tiệc tiết lộ giới tính là một cách thú vị để không cần áp đặt những định kiến ​​hạn chế lên thai nhi trước một đối tượng bạn bè giả vờ quan tâm một cách lịch sự. Tuy nhiên, việc chỉ dựa vào những chiếc bánh nướng có màu nhân tạo để biểu thị một tiếng hoo-ha hoặc một đứa trẻ đi tè đã trở nên xa xỉ trong các bậc cha mẹ trên Instagram.

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Hôm thứ Tư, cựu Bộ trưởng An ninh Nội địa Kirstjen Nielsen vì một lý do nào đó đã được đưa ra một diễn đàn để phát biểu tại Hội nghị thượng đỉnh Những người phụ nữ quyền lực nhất của Fortune. Và có thể đoán trước được, người phụ nữ giám sát các nỗ lực (đang diễn ra) của chính quyền Trump nhằm chia cắt các gia đình ở biên giới đã sử dụng thời gian của mình như một cơ hội để tự bảo vệ mình và tự nhận mình là người — và hãy hít thở sâu ở đây — “đã nói sự thật với quyền lực.

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Vì thế hệ mới nhất của chiếc xe điều chỉnh được yêu thích trên thế giới hiện đã có mặt tại đây, nên chỉ có điều kiện là Toyota Racing Development sẽ đưa phiên bản Supra thế hệ thứ năm sửa đổi của riêng mình đến SEMA vào tháng tới. Toyota đã cho chúng tôi một gợi ý về những gì sẽ xảy ra trong tuần này: một chiếc Concept GR Supra 3000GT hiện đại.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language