cài đặt npm so với cập nhật - sự khác biệt là gì?


519

Sự khác biệt thực tế giữa npm installvà là npm updategì? Khi nào nên sử dụng?

Câu trả lời:


654

Sự khác biệt giữa cài đặt npm và xử lý cập nhật npm của các phiên bản gói được chỉ định trong pack.json :

{
  "name":          "my-project",
  "version":       "1.0",                             // install   update
  "dependencies":  {                                  // ------------------
    "already-installed-versionless-module":  "*",     // ignores   "1.0" -> "1.1"
    "already-installed-semver-module":       "^1.4.3" // ignores   "1.4.3" -> "1.5.2"
    "already-installed-versioned-module":    "3.4.1"  // ignores   ignores
    "not-yet-installed-versionless-module":  "*",     // installs  installs
    "not-yet-installed-semver-module":       "^4.2.1" // installs  installs
    "not-yet-installed-versioned-module":    "2.7.8"  // installs  installs
  }
}

Tóm tắt : Sự khác biệt lớn duy nhất là một mô-đun đã được cài đặt với phiên bản mờ ...

  • bị bỏ qua bởi npm install
  • được cập nhật bởi npm update

Ngoài ra : installupdatetheo mặc định xử lý devDependencies khác nhau

  • npm installsẽ cài đặt / cập nhật devDependencies trừ khi --productioncờ được thêm vào
  • npm updatesẽ bỏ qua devDependencies trừ khi --devcờ được thêm vào

Tại sao lại sử dụng npm install?

Bởi vì npm installlàm nhiều hơn khi bạn nhìn bên cạnh việc xử lý các phụ thuộc của bạn trong package.json. Như bạn có thể thấy trong cài đặt npm, bạn có thể ...

  • tự cài đặt các mô-đun nút
  • đặt chúng là toàn cầu (đặt chúng vào vỏ PATH) bằng cách sử dụngnpm install -g <name>
  • cài đặt các phiên bản nhất định được mô tả bởi thẻ git
  • cài đặt từ url git
  • buộc cài đặt lại với --force

20
và những gì về ~1.3?
Offirmo

6
Nếu phiên bản giống như ^ 5.0.9 thì sao? Và có thể npm install --save somePackagelưu * vào phụ thuộc không?
KwiZ

5
Tôi cũng lưu ý rằng các tập lệnh như postinstallchạy khi cài đặt, nhưng không cập nhật.
Michael Marvick

2
Nếu installupdatehoạt động khác nhau trên các URL git, thẻ git, v.v. được chỉ định trong package.jsonthì sẽ rất tuyệt nếu thêm các trường hợp đó vào ví dụ.
joeytwiddle

2
@ Offer Confirmo dấu ngã trong phiên bản mờ có nghĩa là "cập nhật lên bản phát hành nhỏ (sửa lỗi) mới nhất của gói này", phiên bản nhỏ là số cuối cùng trong phiên bản, tức là 1.3.0 -> 1.3.1Điều này tương tự ^1.3.0, trong đó ^phiên bản chính cập nhật 1.3.0 -> 1.4.0.
Boyan Kushlev

82

cài đặt npm cài đặt tất cả các mô-đun được liệt kê trên package.jsontệp và các phụ thuộc của chúng.

cập nhật npm cập nhật tất cả các gói trong node_modulesthư mục và các phụ thuộc của chúng.

npm install express chỉ cài đặt mô đun express và các phụ thuộc của nó.

npm update express express module (bắt đầu với npm@2.x, nó không cập nhật phụ thuộc của nó).

Vì vậy, các bản cập nhật dành cho khi bạn đã có mô-đun và muốn có phiên bản mới.


5
nếu bạn không chỉ định một phiên bản cụ thể trong tệp pack.json, cài đặt npm sẽ nhận phiên bản mới nhất của mô-đun. Vì vậy, đây là một loại cập nhật.
saeed

11
Vậy tôi nên dùng cái gì, npm installhay npm update? Hay nói cách khác, tôi hiện đang sử dụng npm installvà dường như cũng đang cập nhật, có lý do nào khiến tôi phải sử dụng npm updatekhông?
Borek Bernard

4
Vì vậy, updatesẽ luôn cập nhật lên phiên bản mới nhất, bất kể gói.json, trong khi installsẽ tôn trọng phiên bản được cung cấp trong pack.json?
Borek Bernard

1
updatecài đặt (hoặc cập nhật lên) phiên bản mới nhất của mô-đun. installcài đặt phiên bản mới nhất của mô-đun nếu nó không được trình bày theo cách khác giữ phiên bản hiện tại.
tenphi

11
@Borek npm updatesẽ cập nhật lên phiên bản mới nhất dựa trên gói.json của bạn, không phân biệt. Nếu bạn có "express": "3.x" và bạn đang ở phiên bản 3.1.0, nó sẽ cập nhật lên thẻ 3.x mới nhất. Nếu có phiên bản 4.x, nó sẽ không cài đặt mới nhất.
gcochard

47

Trong hầu hết các trường hợp, điều này sẽ cài đặt phiên bản mới nhất của mô-đun được xuất bản vào npm.

npm install express --save

hoặc tốt hơn để nâng cấp mô-đun lên phiên bản mới nhất sử dụng:

npm install express@latest --save --force

--save: Gói sẽ xuất hiện trong phần phụ thuộc của bạn.

Thông tin thêm: npm-install


11
npm install express@latest --save --forcechính xác là những gì tôi muốn.
ThomasReggi

2
Trong hầu hết các trường hợp? Bất kỳ trường hợp khác?
Dmitri Zaitsev

9

Nhiều sự phân biệt đã được đề cập. Đây là một trong những:

Chạy npm installở phía trên cùng của thư mục nguồn của bạn sẽ chạy các kịch bản khác nhau: prepublish, preinstall, install, postinstall. Tùy thuộc vào những gì các kịch bản này làm, mộtnpm install có thể làm nhiều việc hơn đáng kể so với chỉ cài đặt các phụ thuộc.

Tôi vừa có một trường hợp sử dụng prepublishsẽ gọi makeMakefileđược thiết kế để tìm nạp các phụ thuộc nếu package.jsonđược cập nhật. Gọi npm installtừ bên trong Makefilesẽ dẫn đến một đệ quy vô hạn, trong khi gọi npm updatechỉ hoạt động tốt, cài đặt tất cả các phụ thuộc để việc xây dựng có thể tiến hành ngay cả khi makeđược gọi trực tiếp.


1
Một hàm ý là nếu bạn cập nhật, ví dụ, redismô-đun của bạn và other_moduleyêu cầu phiên bản cũ hơn redis, npm install other_modulesẽ đảm bảo other_modulesẽ sử dụng phiên bản cũ hơn. Nó có thể thêm other_module/node_modules/redisnếu cần thiết.
jlukanta

4

npm update: cài đặt và cập nhật với các mô-đun nút mới nhất có trong pack.json

npm install: cài đặt các mô-đun nút được xác định trong gói.json (không cập nhật)


Sử dụng phiên bản npm 6.9.0 Tôi quan sát hành vi sau: npm updatesẽ bỏ qua một số lượng lớn các phụ thuộc trong package-lock.json. Để có tất cả các gói yêu cầu có sẵn và package-lock.jsonchính xác, tôi luôn phải thực hiện npm installngay sau đó npm update.
Manfred
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.