Tại sao nv npm cài đặt lại viết lại gói-lock.json?


613

Tôi vừa mới nâng cấp lên npm @ 5 . Bây giờ tôi có một gói-lock.json tập tin với tất cả mọi thứ từ package.json . Tôi hy vọng rằng, khi tôi chạy npm installcác phiên bản phụ thuộc sẽ được kéo từ tệp khóa để xác định những gì sẽ đượ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 gói-lock.json của tôi .

Ví dụ: tệp khóa có bản thảo được chỉ định ở 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 tin khóa.

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


4
Điều này không trả lời câu hỏi của bạn vì vậy hy vọng một bình luận là ổn, nhưng hãy xem Sợi. Chuyển đổi mất ít hơn một giờ cho chúng tôi.
kayinKoder

4
Vấn đề tương tự nhưng sử dụng sợi github.com/yarnpkg/yarn/issues/570 (rất hướng dẫn)
Yves M.

2
Tôi gặp vấn đề tương tự. My package-lock.jsonđược tái sinh khi tôi chạy npm install. Điều này có mùi giống như một lỗi npm. Bạn có sử dụng đăng ký của riêng bạn?
HaNdTriX


@YvesM. --no-savengăn thay đổi lockfile, nhưng nó không ảnh hưởng đến việc nâng cấp phụ thuộc cấp độ ngớ ngẩn mà OP đề cập.
Ross Allen

Câu trả lời:


423

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 bối 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à vấn đề GitHub # 18103 .


Cập nhật 1: Hành vi được mô tả bên dưới đã được sửa trong npm 5.4.2: hành vi dự định hiện tại được nêu trong vấn đề GitHub # 17979 .


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

Điều đó có nghĩa là package.jsoncó thể ghi đè package-lock.jsonbất cứ khi nào một phiên bản mới hơn được tìm thấy cho một phụ thuộc package.json. Nếu bạn muốn xác định các 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 phải viết chúng 1.2.0thay vì ~1.2.0hoặc ^1.2.0. Sau đó, sự kết hợp của package.jsonpackage-lock.jsonsẽ mang lại các bản dựng tái sản xuất. Để rõ ràng: package-lock.jsonmột mình không còn khóa phụ thuộc cấp độ gốc!

Cho dù quyết định thiết kế này có tốt hay không là có thể tranh cãi, 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 vấn đề # 17979 . (Trong mắt tôi, đó là một quyết định đáng ngờ; ít nhất cái tên lockđó không còn đúng nữa.)

Thêm một lưu ý nữa: đó cũng là một hạn chế đối với các cơ quan đă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.


43
Hack là npm updategì sau đó? : o Tôi cũng có cảm giác như đã npm installcập nhật deps, nhưng tôi không muốn tin điều đó .. nhưng có vẻ như đó là sự thật đáng buồn .. Dù sao vẫn có tùy chọn để sử dụng npm shrinkwrapđể khóa deps, nhưng chắc chắn tên gói khóa là không chính xác vì nó không đóng băng, cũng không khóa phụ thuộc ..
Jurosh

266
Thật là một mớ hỗn độn! Trình quản lý gói lớn nhất thế giới nhưng nó không có tài liệu về cách thức hoạt động. Mọi người đều đoán về những gì nó nên làm và nó biến thành một cuộc chiến ý kiến. Thảo luận là tốt nhưng nên xảy ra trước khi phát hành vào tự nhiên. Tại một số điểm, ai đó cần thực hiện cuộc gọi cuối cùng và sau đó có thể được thực hiện, ghi lại và phát hành. PHP được thiết kế bởi ủy ban và quảng cáo cùng nhau và xem nó như thế nào. Tôi ghét phải thấy điều tương tự xảy ra với một công cụ quan trọng và được sử dụng rộng rãi này.
Landon Poch

85
Sau đó, điểm của việc sử dụng khóa-gói là gì? Tôi nghĩ rằng nó sẽ tạo ra cùng một môi trường trong các không gian làm việc khác nhau nhưng hóa ra nó không làm gì cả
laltin

17
"Sau đó, sự kết hợp của gói.json và gói-lock.json sẽ mang lại các bản dựng có thể lặp lại." "Gói-lock.json" có vai trò gì ở đây? Không phải "pack.json" đã mang lại các bản dựng có thể lặp lại nếu không có tiền tố phiên bản nào được sử dụng?
Jāni Elmeris

12
@ JānisElmeris Tôi nghĩ gói.json không thể khóa phụ thuộc sâu ...
Juan Mendes

165

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 gói.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 vứt bỏ node_modules của bạn và tạo lại 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ì trong tệp khóa của mình, nó cũng nhanh hơn nhiều (gấp 2 lần!) So với cài đặt npm khi bạn không bắt đầu với một nút_modules.

Như bạn có thể lấy từ cái tên, chúng tôi hy vọng nó sẽ là một lợi ích lớn cho 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 thực hiện sản xuất từ ​​các thẻ git sẽ thấy được lợi nhuận lớn.


133
Đây phải là hành vi mặc định nếu có một lockfile.
nullability

13
Vì vậy, họ đã thay đổi cách npm tôi hoạt động, chỉ để đưa nó trở lại như npm ci tháng sau?
Scott Flack

1
Tôi vẫn còn bối rối. Các tài liệu nói rằng "Hãy chắc chắn rằng bạn có khóa gói và cài đặt cập nhật: npm install" trước khi chạy lệnh npm citrong dự án đó. Không npm installghi đè lên tệp gói-lock.json?
adiga

1
AFAIK: @adiga - bắt đầu với phiên bản 5.4, npm chỉ thay đổi tệp khóa nếu cần thiết để đáp ứng thông số kỹ thuật trong gói.json . Vì vậy, nếu các gói được sử dụng để nói thatpackage: 1và khóa nói ..: 1.0.4, dev có thể chỉnh sửa để nói thatpackage: 2- và điều đó sẽ buộc tệp khóa thay đổi, vì 1.0.4không tương thích với phạm vi mới được chỉ định. Nếu không thay đổi packages.json, sẽ bị khóa ở phiên bản chính xác, cho đến khi xóa tệp khóa. [Nếu không bị khóa và không thay đổi gói.json, hãy gửi báo cáo lỗi.]
ToolmakerSteve

1
@George Từ thông tin tôi đã đọc (đối với các phiên bản gần đây của npm) và thử nghiệm giới hạn của tôi: có cho cả hai.
Venryx

95

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

npm ci

npm ci hứa hẹn lợi ích cao nhất cho các đội lớn. Cung cấp cho các nhà phát triển khả năng để đăng nhập vào chương trình khóa trên một gói khóa thúc đẩy sự hợp 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ì trong một lockfile có khả năng tiết kiệm hàng chục nếu không phải hàng trăm giờ nhà phát triển mỗi tháng, giải phóng các 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 cicho các bản dựng nhanh hơn, đáng tin cậy hơn


3
Điều này có vẻ đúng với tôi? bất cứ ai khác có thể xác nhận?
phouse512

6
@ phouse512 Điều này đúng. Chúng tôi chỉ sử dụng khá nhiều npm civà chỉ sử dụng npm installnếu cập nhật hoặc cài đặt các gói mới.
Jacob Sievers

1
Những bình luận gần đây, v.v ... Đây là câu trả lời tôi sẽ làm. Quá tệ, họ không thể sửa chữa snafu khủng khiếp, nhưng nếu phúc âm mới là "npm ci", thì tốt thôi. Tôi có thể thích nghi.
Svend

Quá tệ, nó luôn xóa một node_modulesthư mục hiện có và xây dựng lại cục bộ, ngay cả khi đó là một liên kết tượng trưng trống nhưng quan trọng. :(
Joe Atzberger

2
@ToolmakerSteve Đừng nín thở! Tôi nghĩ rằng việc xóa nội dung của một thư mục sẽ có cường độ chậm hơn so với chỉ xóa thư mục. Bạn sẽ phải liệt kê nội dung sau đó đưa ra một loạt các lệnh xóa thay vì chỉ một lệnh xóa đối với O / S. Với các vấn đề về hiệu suất được cân bằng trước đó vào lúc npm và việc cải thiện bằng cách sử dụng, npm citôi hy vọng họ sẽ rất miễn cưỡng giới thiệu bất cứ điều gì có thể làm giảm hiệu suất cho một trường hợp sử dụng khá phổ biến. Bạn có thể muốn kiểm tra pnpm.js.org mặc dù điều đó sử dụng các liên kết cứng để giảm mức sử dụng đĩa.
Caltor

64

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

  • npm install chỉ tôn trọng gói-lock.json nếu nó đáp ứng các yêu cầu của gói.json.
  • Nếu nó không đáp ứng các yêu cầu đó, các gói được cập nhật và khóa gói bị ghi đè.
  • Nếu bạn thất bại trong quá trình xây dựng, hơn là viết lại khóa-gói khi điều đó xảy ra, hãy sử dụng npm ci.

Đây là một kịch bản có thể giải thích mọi thứ (Được xác minh bằng NPM 6.3.0)

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

"depA": "^1.0.0"

Sau đó, bạn làm, npm installsẽ tạo ra một gói-lock.json với:

"depA": "1.0.0"

Vài ngày sau, một phiên bản nhỏ hơn của "depA" được phát hành, giả sử "1.1.0", sau đó là đú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 gói.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)

4
Đây thực sự là hành vi dự định của một tập tin "khóa". Rõ ràng, đó không phải là trường hợp của các phiên bản NPM cũ hơn.
Blockost

1
Vậy thì làm thế nào để npm theo dõi bản cập nhật cuối cùng cho pack.json? Điều gì xảy ra khi bạn di chuyển gói.json và gói-lock.json sang một máy tính khác? Làm thế nào để npm trong máy tính mới biết liệu pack.lock là bản gốc hay nó đã được cập nhật, để quyết định xem nó có cần cập nhật gói-lock.json hay không?
Lahiru Chandima

3
@LahiruChandima Nó không thực sự theo dõi cập nhật. npm installsẽ sử dụng các phiên bản bị khóa package-lock.jsontrừ khi nó không đáp ứng package.jsontrong trường hợp nào nó cài đặt gói.json và xây dựng lại gói-lock.json theo đó. Nếu bạn thay đổi package.jsontheo cách mà khóa gói hiện tại vẫn đáp ứng được cập nhật, package.jsonnó sẽ tiếp tục sử dụngpackage-lock
Ahmad Abdelghany

1
Nếu bạn đã có một mô-đun trong node_modules đáp ứng các yêu cầu của pack.json, thì npm installkhông có gì, bất kể gói-lock.json. Chúng tôi phải cập nhật rõ ràng các gói ngay cả khi có các bản cập nhật phù hợp với ngữ nghĩa được chỉ định trong pack.json. Ít nhất đó là kinh nghiệm của tôi trong nhiều năm.
carlin.scott

1
@ToolmakerSteve Tôi cũng hoài nghi về hành vi @ carlin.scott đã báo cáo, nhưng tôi chỉ thử nghiệm nó, và thực tế anh ấy đã đúng. Nếu phiên bản trong node_modulesthỏa mãn phạm vi trong package.jsonvà không có package-lock.jsontệp, npm sẽ không cập nhật mô-đun khi chạy npm install. Tôi đoán sẽ ổn vì bạn có thể sử dụng npm update(hoặc npm-checkmới nhất) để cập nhật các phụ thuộc và hành vi này nhanh hơn đối với trường hợp ai đó chỉ cần thêm một mục nhập package.jsonvà không muốn các gói không liên quan cập nhật lên bản mới nhất thỏa mãn sem-ver phạm vi.
Venryx

19

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

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

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

Nó sẽ tạo ra các bản dựng giống hệt nhau cho các đồ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 viết trên blog này: https://blog.npmjs.org/post/171556855892/int sinhing-npm-cci-for-quick- cậy


2
ciđề cập đến "tích hợp liên tục", như được đề cập trong các tài liệu và bài đăng trên blog thông báo lệnh: blog.npmjs.org/post/171556855892/ trộm
Joe Atzberger

Cảm ơn Joe. Tôi đã cập nhật câu trả lời của mình với tên chính xác và được liên kết với bài đăng trên blog. (Đối với những người đọc nó, trước đây tôi đã nói rằng nó là viết tắt của "cài đặt sạch")
Daniel Tonon

"Và nó cũng nhanh hơn nhiều" - nó sẽ xóa node_modulesthư mục và tạo lại từ đầu. Có thực sự nhanh hơn nhiều? Có npm installxóa node_modulesthư mục không?
izogfif

Tôi nghĩ tốc độ đến từ npm không cần tính toán những gói cần tải xuống. Hãy nghĩ về nó như npm installphải giải quyết tất cả các phụ thuộc gói khi chạy. npm cichỉ là một danh sách mua sắm "có được các mô-đun chính xác".
Daniel Tonon

8

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.json mà không sửa đổi nó.

Điều này sẽ hữu ích cho các môi trường CI, vv trong đó 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.


Tôi nghi ngờ điều đó. Làm thế nào nếu phụ thuộc khác nhau cho các hệ điều hành khác nhau, làm thế nào bạn có thể buộc cài đặt một cái gì đó không hoạt động?
Yevgeniy Afanasyev

4
@YevgeniyAfanasyev Thay vì lá cờ đó, nó đã được thực hiện vì npm cinó cũng xử lý câu hỏi của bạn.
spex

8

Có vẻ như vấn đề này được khắc phục trong npm v5.4.2

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

(Cuộn xuống bình luận cuối cùng trong chuỗi)

Cập nhật

Thực tế đã được sửa trong 5.6.0. Có một lỗi đa nền tảng trong 5.4.2 đã gây ra 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ó.


5
Tôi đang sử dụng 5.4.2 và nó vẫn dẫn đến việc sửa đổi gói-lock.json của tôi khi nào npm i. Chẳng hạn, mô-đun fseventsbị loại bỏ khi tôi npm itrên một máy không hỗ trợ fseventsvà sau đó mô-đun được thêm lại khi một npm ilần nữa trên máy đó.
hrdwdmrbl

Sau đó, bạn nên đưa ra một vấn đề mới trong repo npm GitHub giải thích điều này. Nếu nó không hoạt động như thế nào thì họ nói nó đáng lẽ phải hoạt động thì họ coi đó là một lỗi ưu tiên cao cần khẩn trương sửa chữa.
Daniel Tonon

@hrdwdmrbl tôi nhìn thấy cùng fseventssụt giảm của tôi package-lock.jsonvới npm@5.5đồng thời cộng tác với Mac OS X đóng góp. Nếu bạn chưa mở một vấn đề, tôi sẽ.
AL

@hrdwdmrbl Tôi thấy rằng (và chuỗi dài các vấn đề liên quan) sau khi tôi để lại nhận xét của mình và quên quay lại SO để cập nhật nhận xét của mình. Cảm ơn vì đã trở lại. Mọi thứ đều ổn.
AL ngày X

4

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

"typescript":"~2.1.6"

trong package.jsonnpm 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.1yê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.1như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 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à cho biết ngày mai typescriptphá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


29
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.
Viper Bailey

3
Và đó là điều tôi đang nói. Tệp khóa gói của tôi cho biết typcript@2.1.6 nhưng khi tôi chạy cài đặt npm, mục nhập được thay thế bằng typecript@2.4.1.
Viper Bailey

5
Tôi đã trải qua vấn đề tương tự. Trong CI / CD của chúng tôi, phần mềm package-lock.jsonđược kéo xuống và sau đó chúng tôi chạy npm install, nhưng package-lock.jsontệp đã được sửa đổi và chúng tôi phải thực hiện thiết lập lại trước khi chúng tôi có thể kéo các thay đổi tiếp theo.
BayssMekanique

15
Tôi không hiểu Làm thế nào đây là một tập tin "khóa" nếu các lần cài đặt tiếp theo vẫn có thể nâng cấp?!
Ross Allen

5
Tôi nghĩ rằng họ đã bắt đầu với ý tưởng có tệp này là "thông tin" và "khóa" và sau đó, quyết định nó sẽ chỉ là một tệp "thông tin". Tên tốt hơn sẽ là "gói-info.json". Tôi rất thích có một "khóa cài đặt npm" sẽ cài đặt từ "gói-lock.json" và bỏ qua "pack.json"
Jeremy Chone

2

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 của gói.

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 installkhông cài đặt các gói lấy packge.jsonlàm tham chiếu. Trường hợp trong trường hợpnpm ci , nó sẽ cài đặt các gói lấy package-lock.jsonlàm tham chiếu, đảm bảo mỗi lần gói chính xác được cài đặt.


1

Có một vấn đề mở cho điều 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.


Việc viết lại trong khóa gói được dự định, vấn đề không phải là hậu quả của việc này
Z. Khullah

0

EDIT: tên "khóa" là một mánh khóe, NPM của nó đang cố gắng bắt kịp với Sợi. Nó không phải là một tập tin bị khóa nào. package.jsonlà một tệp do người dùng cố định, một khi "đã cài đặt" sẽ tạo cây thư mục node_modules và cây đó sẽ được ghi vào package-lock.json. Vì vậy, bạn thấy đấy, cách khác của nó xung quanh - phụ thuộc phiên bản sẽ được kéo từ package.jsonnhư mọ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 lượt tải xuống)


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 tái tạo chính xác và quan trọng hơn" (được lấy từ chính tài liệu npm ).

Đối với tên khó khăn, NPM của nó cố gắng bắt kịp với Sợi.


1
Bởi vì nếu bạn chạy NPM cài đặt, gói-lock sẽ được cập nhật.
Jean-Baptiste
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.