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 install
lệ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?
Cập nhật 3: Như các câu trả lời khác cũng chỉ ra, npm ci
lệ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ệu và blog 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.json
có thể ghi đè package-lock.json
bấ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.0
thay vì ~1.2.0
hoặc ^1.2.0
. Sau đó, sự kết hợp của package.json
và package-lock.json
sẽ tạo ra các bản dựng có thể tái tạo. Để rõ ràng: package-lock.json
mộ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.
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.json
chỉ
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.
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.
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.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)
Sử dụng npm ci
lệ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
Trong tương lai, bạn sẽ có thể sử dụng --from-lock-file
cờ (hoặc tương tự) để chỉ cài đặt từ package-lock.json
mà 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.
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ó.
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.1
yêu cầuwidget ~v1.0.0
. Khi bạn npm cài đặt nó sẽ lấywidget 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 đượctypescript v2.4.1
nhưngwidget
đã được cập nhật lênwidget 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 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ếutypescript
bị khóa tại2.4.1
của bạnpackage-lock.json
, nó sẽ vẫn như vậy cho đến khi nó được thay đổi. Và hãy nói rằngtypescript
phiên bản phát hành ngày mai2.4.2
. Nếu tôi kiểm tra chi nhánh của bạn và chạynpm install
, npm sẽ tôn trọng tệp khóa và cài đặt2.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 đó.
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 install
và npm ci
cài đặt các phụ thuộc cần thiết cho dự án.
Sự khác biệt chính là,
npm install
cài đặt các gói lấypackge.json
làm tham chiếu. Trong trường hợp củanpm ci
, nó cài đặt các gói lấypackage-lock.json
làm tham chiếu, đảm bảo mỗi khi gói chính xác được cài đặt.
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.
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.json
là 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.json
mọi khi và package-lock.json
nê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.json
có các phụ thuộc của bạn như bình thường, trong khi đó package-lock.json
là "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.
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.
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ì?
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.
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.
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!
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.
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?
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.
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).
Đố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.
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.
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 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. 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ì!
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
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 +"
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.
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.
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.
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.