Câu trả lời:
Từ các tài liệu npm :
Nói tóm lại, sự khác biệt chính giữa việc sử dụng cài đặt npm và npm ci là:
- Dự án phải có gói-lock.json hoặc npm-shrwrap.json hiện có.
- Nếu các phụ thuộc trong khóa gói không khớp với các gói trong gói.json, npm ci sẽ thoát với một lỗi, thay vì cập nhật khóa gói.
- npm ci chỉ có thể cài đặt toàn bộ dự án tại một thời điểm: các phụ thuộc riêng lẻ có thể được thêm bằng lệnh này.
- Nếu một nút_modules đã có sẵn, nó sẽ tự động bị xóa trước khi npm ci bắt đầu cài đặt.
- Nó sẽ không bao giờ ghi vào pack.json hoặc bất kỳ khóa-gói nào: các bản cài đặt về cơ bản bị đóng băng.
Về cơ bản,
npm install
đọc package.json
để tạo danh sách các phụ thuộc và sử dụng package-lock.json
để thông báo phiên bản nào của các phụ thuộc này sẽ được cài đặt. Nếu một phụ thuộc không có trong package-lock.json
nó sẽ được thêm vàonpm install
.
npm ci
(được đặt tên theo C liên tục I ntegration) cài đặt các phụ thuộc trực tiếp từ package-lock.json
và package.json
chỉ sử dụng để xác thực rằng không có phiên bản không khớp. Nếu bất kỳ phụ thuộc nào bị thiếu hoặc có phiên bản không tương thích, nó sẽ gây ra lỗi .
Sử dụng npm install
để thêm các phụ thuộc mới và để cập nhật các phụ thuộc vào một dự án. Thông thường, bạn sẽ sử dụng nó trong quá trình phát triển sau khi lấy các thay đổi cập nhật danh sách các phụ thuộc nhưng có thể nên sử dụng npm ci
trong trường hợp này.
Sử dụng npm ci
nếu bạn cần một bản dựng xác định, lặp lại. Ví dụ, trong quá trình tích hợp liên tục, các công việc tự động, v.v. và khi cài đặt phụ thuộc lần đầu tiên, thay vì npm install
.
npm install
npm-shrinkwrap.json
và package-lock.json
(theo thứ tự đó).node_modules
.package.json
hoặc package-lock.json
.
npm i packagename
) nó có thể ghi vào package.json
để thêm hoặc cập nhật phụ thuộc.npm i
) nó có thể ghi vào package-lock.json
để khóa phiên bản của một số phụ thuộc nếu chúng chưa có trong tệp này.npm ci
package-lock.json
hoặc npm-shrinkwrap.json
phải có mặt.package.json
.node_modules
và cài đặt tất cả các phụ thuộc cùng một lúc.package.json
hay package-lock.json
.Trong khi npm ci
tạo toàn bộ cây phụ thuộc từ package-lock.json
hoặc npm-shrinkwrap.json
, npm install
cập nhật nội dungnode_modules
sử dụng thuật toán ( nguồn ) sau:
load the existing node_modules tree from disk clone the tree fetch the package.json and assorted metadata and add it to the clone walk the clone and add any missing dependencies dependencies will be added as close to the top as is possible without breaking any other modules compare the original tree with the cloned tree and make a list of actions to take to convert one to the other execute all of the actions, deepest first kinds of actions are install, update, remove and move
npm install package
có thể sửa đổi cả hai package-lock.json
và package.json
, trong khi các npm install
đối số không chỉ sửa đổipackage-lock.json
npm ci
sẽ xóa mọi thư mục node_modules hiện có và dựa vào package-lock.json
tệp để cài đặt phiên bản cụ thể của từng gói. Nó nhanh hơn đáng kể so với cài đặt npm vì nó bỏ qua một số tính năng. Cài đặt trạng thái sạch sẽ rất tốt cho các đường ống ci / cd và các bản dựng docker! Bạn cũng sử dụng nó để cài đặt tất cả mọi thứ cùng một lúc và không phải các gói cụ thể.
Các tài liệu bạn liên kết đã có bản tóm tắt:
Nói tóm lại, sự khác biệt chính giữa việc sử dụng cài đặt npm và npm ci là:
- Dự án phải có gói-lock.json hoặc npm-shrwrap.json hiện có.
- Nếu các phụ thuộc trong khóa gói không khớp với các gói trong gói.json, npm ci sẽ thoát với một lỗi, thay vì cập nhật khóa gói.
- npm ci chỉ có thể cài đặt toàn bộ dự án tại một thời điểm: các phụ thuộc riêng lẻ có thể được thêm bằng lệnh này.
- Nếu một nút_modules đã có sẵn, nó sẽ tự động bị xóa trước khi npm ci bắt đầu cài đặt.
- Nó sẽ không bao giờ ghi vào pack.json hoặc bất kỳ khóa-gói nào: các bản cài đặt về cơ bản bị đóng băng.
Các lệnh rất giống nhau về chức năng tuy nhiên sự khác biệt nằm ở cách tiếp cận được thực hiện để cài đặt các phụ thuộc được chỉ định trong tệp package.json
và package-lock.json
tệp của bạn .
npm ci
thực hiện cài đặt sạch tất cả các phụ thuộc của ứng dụng của bạn trong khi npm install
có thể bỏ qua một số cài đặt nếu chúng đã tồn tại trên hệ thống. Một vấn đề có thể phát sinh nếu phiên bản đã được cài đặt trên hệ thống không phải là phiên bản bạn package.json
định cài đặt, tức là phiên bản đã cài đặt khác với phiên bản ' bắt buộc '.
Sự khác biệt khác là npm ci
không bao giờ chạm vào các package*.json
tập tin của bạn . Nó sẽ dừng cài đặt và hiển thị lỗi nếu các phiên bản phụ thuộc không khớp trong tệp package.json
và package-lock.json
.
Bạn có thể đọc một lời giải thích tốt hơn nhiều từ các tài liệu chính thức ở đây .
Ngoài ra, bạn có thể muốn đọc về khóa gói ở đây .
Điều đáng lưu ý là các hình ảnh docker nút ánh sáng như alpine không được cài đặt Python, đây là một phụ thuộc node-gyp
được sử dụng bởi npm ci
.
Tôi nghĩ rằng có một chút ý kiến rằng để hoạt npm ci
động, bạn cần cài đặt Python làm phụ thuộc trong bản dựng của mình.
Thêm thông tin ở đây Docker và npm - gyp ERR! không ổn
Bạn nên sử dụng chúng trong các tình huống khác nhau.
npm install
là tuyệt vời để phát triển và trong CI khi bạn muốn lưu trữ node_modules
thư mục. Khi nào sử dụng cái này? Bạn có thể làm điều này nếu bạn đang tạo một gói cho người khác sử dụng (bạn KHÔNG bao gồm node_modules
trong bản phát hành như vậy) . Về bộ nhớ đệm, hãy cẩn thận, nếu bạn có kế hoạch hỗ trợ các phiên bản Node.js
ghi nhớ khác nhau node_modules
có thể phải được cài đặt lại do sự khác biệt giữa các Node.js
yêu cầu thời gian chạy. Nếu bạn muốn dính vào một phiên bản, hãy bám vào bản mới nhất LTS
.
npm ci
nên được sử dụng khi bạn kiểm tra và phát hành ứng dụng sản xuất (sản phẩm cuối cùng, không được sử dụng bởi các gói khác) vì điều quan trọng là bạn phải cài đặt càng xác định càng tốt, việc cài đặt này sẽ mất nhiều thời gian hơn nhưng cuối cùng sẽ thực hiện ứng dụng của bạn đáng tin cậy hơn (bạn bao gồm node_modules
trong một bản phát hành như vậy) . Gắn bó với LTS
phiên bản của Node.js
.
Phần thưởng: Bạn có thể trộn chúng tùy thuộc vào mức độ phức tạp mà bạn muốn thực hiện. Trên các nhánh tính năng, git
bạn có thể lưu trữ bộ đệm node_modules
để tăng năng suất cho nhóm của bạn và trên yêu cầu hợp nhất và các nhánh chính dựa trên npm ci
kết quả xác định.
npm install
có thể viết thư cho pack.json. Bạn có biết những gì nó có thể viết ở đây?