Sự khác biệt giữa cài đặt npm npm cài đặt và npm cpm là gì?


214

Tôi đang làm việc với sự tích hợp liên tục và phát hiện ra lệnh npm ci .

Tôi không thể tìm ra những lợi thế của việc sử dụng lệnh này cho quy trình làm việc của tôi.

Có nhanh hơn không? Liệu nó làm cho bài kiểm tra khó hơn, được, và sau?

Câu trả lời:


327

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.jsonnó 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.jsonpackage.jsonchỉ 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 citrong trường hợp này.

Sử dụng npm cinế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

  • Cài đặt một gói và tất cả các phụ thuộc của nó.
  • Sự phụ thuộc được thúc đẩy bởi npm-shrinkwrap.jsonpackage-lock.json(theo thứ tự đó).
  • không có đối số : cài đặt các phụ thuộc của một mô đun cục bộ.
  • Có thể cài đặt các gói toàn cầu.
  • Sẽ cài đặt bất kỳ phụ thuộc bị thiếu trong node_modules.
  • Nó có thể viết cho package.jsonhoặc package-lock.json.
    • Khi được sử dụng với một đối số ( npm i packagename) nó có thể ghi vào package.jsonđể thêm hoặc cập nhật phụ thuộc.
    • khi được sử dụng mà không có đối số, ( 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

  • Yêu cầu ít nhất npm v5.7.1 .
  • Yêu cầu package-lock.jsonhoặc npm-shrinkwrap.jsonphải có mặt.
  • Ném lỗi nếu phụ thuộc từ hai tệp này không khớp package.json.
  • Loại bỏ node_modulesvà cài đặt tất cả các phụ thuộc cùng một lúc.
  • Nó không bao giờ viết cho package.jsonhay package-lock.json.

Thuật toán

Trong khi npm citạo toàn bộ cây phụ thuộc từ package-lock.jsonhoặ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

1
Tôi không biết npm installcó thể viết thư cho pack.json. Bạn có biết những gì nó có thể viết ở đây?
Veve

5
cũng có thể là một chút sai lệch ... nó sẽ ghi vào pack.json khi bạn sử dụng nó để cài đặt, cập nhật hoặc xóa phụ thuộc. Tôi sẽ làm cho nó rõ ràng hơn trong văn bản, cảm ơn!
lucascaro

Thuật toán này được ghi nhận ở đâu? Tức là nguồn của bạn là gì?
Yngvar Kristiansen

1
@YngvarKristiansen trong tài liệu npm, đã thêm một liên kết đến phần cụ thể để tham khảo
lucascaro

4
npm install packagecó thể sửa đổi cả hai package-lock.json package.json , trong khi các npm installđối số không chỉ sửa đổipackage-lock.json
knobo

20

npm cisẽ xóa mọi thư mục node_modules hiện có và dựa vào package-lock.jsontệ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ể.


9

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.

2

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.jsonpackage-lock.jsontệp của bạn .

npm cithự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 installcó 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 cikhông bao giờ chạm vào các package*.jsontậ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.jsonpackage-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 .


1

Đ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


0

Trong khi mọi người khác đã trả lời về sự khác biệt kỹ thuật, không ai giải thích được trong những tình huống sử dụng cả hai.

Bạn nên sử dụng chúng trong các tình huống khác nhau.

npm installlà tuyệt vời để phát triển và trong CI khi bạn muốn lưu trữ node_modulesthư 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_modulestrong 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.jsghi nhớ khác nhau node_modulescó thể phải được cài đặt lại do sự khác biệt giữa các Node.jsyê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 cinê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_modulestrong một bản phát hành như vậy) . Gắn bó với LTSphiê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, gitbạ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 cikết quả xác định.

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.