Câu hỏi Làm cách nào để cập nhật từng phụ thuộc trong package.json lên phiên bản mới nhất?


Tôi đã sao chép package.json từ một dự án khác và bây giờ muốn bump tất cả các phụ thuộc vào các phiên bản mới nhất của họ vì đây là một dự án mới và tôi không ngại sửa chữa một cái gì đó nếu nó bị hỏng.

Cách dễ nhất để làm điều này là gì?

Cách tốt nhất tôi biết bây giờ là chạy npm info express version sau đó cập nhật package.json theo cách thủ công cho từng tệp. Phải có cách tốt hơn.

{
  "name": "myproject",
  "description": "my node project",
  "version": "1.0.0",
  "engines": {
    "node": "0.8.4",
    "npm": "1.1.65"
  },
  "private": true,
  "dependencies": {
    "express": "~3.0.3", // how do I get these bumped to latest?
    "mongodb": "~1.2.5",
    "underscore": "~1.4.2",
    "rjs": "~2.9.0",
    "jade": "~0.27.2",
    "async": "~0.1.22"
  }
}

Tôi hiện là cộng tác viên trên npm-check-updates, đó là một giải pháp tuyệt vời cho vấn đề này.


1436
2018-04-18 02:39


gốc


Mỗi khi tôi kết thúc câu hỏi này là bởi vì tôi đang tìm kiếm github.com/tbranyen/salita. Công cụ CLI đơn giản để cập nhật tất cả các phụ thuộc vào phiên bản mới nhất. - Gajus
Thật tuyệt khi thấy một cách tiếp cận khác cho vấn đề này. Tôi thực sự thích đầu ra của Salita. Một số tính năng tuyệt vời mà công cụ tôi đóng góp hiện nay, github.com/tjunnone/npm-check-updates, là bảo toàn ngữ nghĩa phiên bản (như 1.x hoặc> 2.1.0) và lọc theo tên / regex / devDeps-only. - Raine Rupert Revere
Có CẦN là một số câu trả lời tốt hơn ở đây. Rõ ràng với độ phân giải phụ thuộc, bạn không thể luôn có phiên bản mới nhất của mọi thứ. Tối đa hóa số lượng lớn nhất các phiên bản mới nhất của mô-đun chỉ là, một số loại vấn đề tối ưu hóa. Nhưng NPM không biết bạn muốn trở thành mô-đun nào gần đây nhất so với các mô-đun khác. Sẽ rất tuyệt nếu có một cái gì đó như thế này: cập nhật npm --latest x y z, trong đó x y z là các mô-đun bạn muốn càng gần càng tốt và tất cả các mô-đun khác sẽ theo phiên bản tương thích mới nhất của chúng. - Alexander Mills
npm sẽ xử lý chính xác xung đột phiên bản giữa các phụ thuộc được chia sẻ bằng cách tải xuống chính xác từng phần phụ thuộc. Vì vậy, nếu Dep A phụ thuộc vào Dep C v1.0.0 và Dep B phụ thuộc vào Dep C v2.0.0, chúng sẽ được cài đặt và sử dụng một cách thích hợp. Do đó, bạn được tự do cài đặt phiên bản mới nhất của bất kỳ gói nào bạn muốn. - Raine Rupert Revere


Các câu trả lời:


Giống như npm-check-updates là cách duy nhất để thực hiện điều này ngay bây giờ.

npm i -g npm-check-updates
ncu -u
npm install

Vào npm <3.11:

Chỉ cần thay đổi mọi phiên bản của phụ thuộc thành *, sau đó chạy npm update --save. (Chú thích:  bị hỏng trong các phiên bản npm gần đây (3.11)).

Trước:

  "dependencies": {
    "express": "*",
    "mongodb": "*",
    "underscore": "*",
    "rjs": "*",
    "jade": "*",
    "async": "*"
  }

Sau:

  "dependencies": {
    "express": "~3.2.0",
    "mongodb": "~1.2.14",
    "underscore": "~1.4.4",
    "rjs": "~2.10.0",
    "jade": "~0.29.0",
    "async": "~0.2.7"
  }

Tất nhiên, đây là cái búa cùn của việc cập nhật các phụ thuộc. Sẽ ổn nếu như bạn nói - dự án trống và không có gì có thể phá vỡ.

Mặt khác, nếu bạn đang làm việc trong một dự án trưởng thành hơn, bạn có thể muốn xác minh rằng không có thay đổi đột ngột nào trong các phụ thuộc của bạn trước khi nâng cấp.

Để xem mô-đun nào đã lỗi thời, chỉ cần chạy npm outdated. Nó sẽ liệt kê bất kỳ phụ thuộc đã cài đặt nào có sẵn các phiên bản mới hơn.


1698
2018-04-18 03:35



@thefourtheye: Bạn thường không nên rời khỏi  * trong package.json vì bạn có thể sẽ tự động cài đặt phiên bản mô-đun mới với các thay đổi đột phá làm hỏng ứng dụng của bạn. Vì chúng tôi đang sử dụng --save ở đây, * được thay thế bằng phiên bản hiện tại của mỗi gói. - josh3736
Tôi không thể làm được điều này. Có gì thay đổi với npm kể từ khi câu trả lời này đã được đăng? Khi tôi sử dụng ký tự đại diện và sau đó npm install --save ký tự đại diện còn lại trong package.json. - davidtheclark
Thật không may, sử dụng update không làm việc, cho tôi. Tôi vẫn còn với các ký tự đại diện. Có bất kỳ tài liệu nào về điều này mà bạn biết hay bất kỳ tài nguyên nào khác mà tôi có thể xem xét không? - davidtheclark
Một chút cũ nhưng có thể giúp người khác: github.com/tjunnone/npm-check-updates | Sử dụng npm install -g npm-check-updates để cài đặt, sau đó npm-check-updates để kiểm tra xem phụ thuộc của bạn có cập nhật hay không npm-check-updates -u để cập nhật các phiên bản package.json của bạn. Sau đó, nó chỉ là npm install và nó sẽ tải xuống các phiên bản mới. - RaphaelDDL
Có vẻ như nó chỉ cập nhật package.json cho các gói thực sự được cập nhật. Tôi thấy rằng nếu tôi xóa node_modules trước khi chạy lệnh, nó thực hiện như được mô tả trong câu trả lời gốc. - Josh Santangelo


npm-check-updates là một tiện ích tự động điều chỉnh gói package.json bằng phiên bản mới nhất của tất cả các phụ thuộc

xem https://www.npmjs.org/package/npm-check-updates

$ npm install -g npm-check-updates
$ ncu -u
$ npm install 

863
2018-04-03 21:53



Điều này nên có sẵn nguyên bản thông qua lệnh npm chính nó, thực sự giải pháp tốt nhất cho đến nay để cập nhật các phụ thuộc. - Mohammad Arif
Nên là một phần của npm nguyên bản, hoàn toàn đồng ý. Tuy nhiên, nó không phải là và giải pháp này đến như một khoe. Cảm ơn bạn. - Aichholzer
Tôi hiện là cộng tác viên trên npm-check-updates và hoàn toàn có thể tán thành nó. - Raine Rupert Revere
tôi cho rằng các bạn đã đẩy [HARD] để có được điều này vào npm cốt lõi? - enorl76
@Batman Có nếu bạn không cài đặt trước đó. Nếu không, hãy sử dụng cập nhật npm. ncu chỉ cập nhật package.json. Nó không cài đặt hoặc cập nhật 'node_modules'. - wisemann


TLDR; (được cập nhật cho các phiên bản NPM mới hơn)

Mọi thứ đã thay đổi một chút vì những câu trả lời này ban đầu được viết.

npm 2+: npm outdated+npm update+npm shrinkwrap

Cũ hơn npm: npm-check-updates gói + npm shrinkwrap

Hãy chắc chắn để thu nhỏ deps của bạn, hoặc bạn có thể gió lên với một dự án đã chết. Tôi rút ra một dự án vào ngày hôm sau và nó sẽ không chạy vì deps của tôi là tất cả trong ngày / cập nhật / một mớ hỗn độn. Nếu tôi thu nhỏ lại, npm sẽ cài đặt chính xác những gì tôi cần.


Chi tiết

Đối với những người tò mò làm cho nó xa này, đây là những gì tôi khuyên bạn nên:

Sử dụng npm-check-updates hoặc là npm outdated để đề xuất các phiên bản mới nhất.

# `outdated` is part of newer npm versions (2+)
$ npm outdated
# If you agree, update.  
$ npm update

#       OR

# Install and use the `npm-check-updates` package.
$ npm install -g npm-check-updates
# Then check your project
$ npm-check-updates
# If you agree, update package.json.
$ npm-check-updates -u

Sau đó làm một cài đặt sạch (w / o rm tôi có một số cảnh báo phụ thuộc)

$ rm -rf node_modules
$ npm install 

Cuối cùng, lưu các phiên bản chính xác vào npm-shrinkwrap.json với npm shrinkwrap

$ rm npm-shrinkwrap.json
$ npm shrinkwrap

Hiện nay, npm install bây giờ sẽ sử dụng các phiên bản chính xác trong npm-shrinkwrap.json

Nếu bạn kiểm tra npm-shrinkwrap.json thành git, tất cả các lượt cài đặt sẽ sử dụng cùng một phiên bản chính xác.

Đây là một cách để chuyển đổi ra khỏi phát triển (tất cả các bản cập nhật, tất cả các thời gian) để sản xuất (không ai chạm vào không có gì).


294
2018-06-02 22:29



đây là câu trả lời đúng. với hàng tá deps được cài đặt, điều này là def một cách tốt hơn - Angel S. Moreno
Từ kinh nghiệm, lời khuyên để luôn luôn cập nhật tất cả các gói cùng một lúc có thể nguy hiểm. - alphadogg
Chắc chắn. Nếu bạn tạo và npm-shrinkwrap.json vào nguồn và cam kết bất cứ khi nào bạn cập nhật, bạn luôn có thể 'quay lại vị trí của mình'. Tôi bỏ qua tính năng thu nhỏ khi tôi bắt đầu. - Michael Cole
điều này không không phải trả lời câu hỏi. Câu hỏi đặt ra là cách cập nhật muộn nhất phiên bản. npm update chỉ cập nhật phiên bản semver chứ không phải mới nhất. - gman
Bạn có thể trả lời nếu có thay thế yarn upgrade package@version? - highmaintenance


Cập nhật một phụ thuộc vào phiên bản mới nhất của nó mà không phải mở thủ công package.json và thay đổi nó, bạn có thể chạy

npm install {package-name}@* {save flags?}

I E.

npm install express@* --save

Để tham khảo, npm-install


Theo ghi nhận của người dùng Vespakoen trên bản chỉnh sửa bị từ chối, bạn cũng có thể cập nhật nhiều gói cùng một lúc theo cách này:

npm install --save package-nave@* other-package@* whatever-thing@*

Ông cũng apports một lớp lót cho vỏ dựa trên npm outdated. Xem bản chỉnh sửa cho mã và giải thích.


PS: Tôi cũng ghét phải chỉnh sửa theo cách thủ công package.json cho những thứ như thế;)


155
2018-04-30 14:51



Giải pháp này rất tuyệt. Cách nhanh chóng và dễ dàng để cập nhật một gói một cách rõ ràng lên phiên bản mới nhất mà không cần cài đặt bất kỳ mô-đun mới nào. Tôi thích npm-check-updates, nhưng nó vẫn cố gắng giữ tất cả các các gói cập nhật, không phải lúc nào cũng là những gì bạn muốn. - Chev
điều này không hiệu quả với tôi npm install react-native-image-picker@* --save - Harry Moreno
Sử dụng npm outdated -l để hiển thị cho dù mỗi gói là một phụ thuộc hoặc devDependency. Sử dụng npm install --save-dev để tiết kiệm như một devDependency. - cambunctious
@Chev: ncu có thể dễ dàng nhắm mục tiêu một hoặc nhiều gói với ncu express mocha chai. Bạn cũng có thể loại trừ các gói với ncu -x mocha. Tôi đồng ý ở trên là giải pháp đơn giản nhất mặc dù để cập nhật một gói duy nhất. - Raine Rupert Revere
Nếu sử dụng bash, một bí danh với oneliner sau để cập nhật devDeps npm outdated -lp|awk -F':' '$5~/^dev/{print $4}'|xargs npm i -D và điều này để cập nhật deps npm outdated -lp|awk -F':' '$5~/^dep/{print $4}'|xargs npm i -P. - archemiro


Nếu bạn tình cờ sử dụng Mã Visual Studio như IDE của bạn, đây là một phần mở rộng nhỏ vui nhộn để cập nhật package.json một quá trình một cú nhấp chuột.

Phiên bản Lense

enter image description here


51
2018-03-27 20:00



Đây là những gì tôi cần. cảm ơn nhiều bạn đã cứu tôi một ngày - Akarsh Kolanu
Có phiên bản 3 văn bản tuyệt vời ở đây: github.com/yavorsky/Bump, mặc dù hơi chậm. - Alexander Kim
Làm việc rất đẹp, trong trường hợp nó không rõ ràng với bất kỳ ai, điều này chỉ đơn giản là kiểm tra các phiên bản trong package.json của bạn dựa trên các phiên bản kho lưu trữ npm mới nhất và cho phép bạn nhấp vào một phiên bản để cập nhật nội dung văn bản trong package.json của bạn. Sau đó, bạn cần chạy "npm update" để thông báo cho npm cài đặt phiên bản mới. - MattG


Điều này hoạt động như của npm 1.3.15.

"dependencies": {
  "foo": "latest"
}

49
2018-01-21 22:35



Tốt để biết. Tôi đoán rằng điều này nói chung sẽ là một thực hành tồi trên bất kỳ trang web sản xuất nào vì nó sẽ tự động cập nhật lên các phiên bản không tương thích ngược. Cú pháp '~ 2' khóa bạn vào một số phiên bản chính đã cho, theo sau semver sẽ tương thích ngược. - Raine Rupert Revere
Bạn luôn có thể đóng băng dep trên sản phẩm. Có một mệnh lệnh cho điều đó. -2 âm thanh ok. - Tobiasz Cudnik
Tôi thích sử dụng nó cùng với npm shrinkwrap để đóng băng deps. - daniellmb


  1. Sử dụng * làm phiên bản cho các bản phát hành mới nhất, bao gồm cả không ổn định
  2. Sử dụng latest dưới dạng định nghĩa phiên bản cho phiên bản ổn định mới nhất
  3. Sửa đổi package.json với chính xác số phiên bản ổn định mới nhất bằng cách sử dụng LatestStablePackages

Đây là một ví dụ:

"dependencies": {
        "express": "latest"  // using the latest STABLE version
    ,   "node-gyp": "latest"    
    ,   "jade": "latest"
    ,   "mongoose": "*" // using the newest version, may involve the unstable releases
    ,   "cookie-parser": "latest"
    ,   "express-session": "latest"
    ,   "body-parser": "latest"
    ,   "nodemailer":"latest"
    ,   "validator": "latest"
    ,   "bcrypt": "latest"
    ,   "formidable": "latest"
    ,   "path": "latest"
    ,   "fs-extra": "latest"
    ,   "moment": "latest"
    ,   "express-device": "latest"
},

38
2018-01-23 03:45



Đây là cách tiếp cận tốt hơn * một. Cảm ơn - jsbisht
Và đừng quên cập nhật npm - lưu trữ - Sandip Subedi


Các caveat chỉ tôi đã tìm thấy với câu trả lời tốt nhất ở trên là nó cập nhật các mô-đun để phiên bản mới nhất. Điều này có nghĩa là nó có thể cập nhật lên bản alpha không ổn định.

Tôi sẽ sử dụng tiện ích npm-check-updates đó. Nhóm của tôi đã sử dụng công cụ này và nó hoạt động hiệu quả bằng cách cài đặt các bản cập nhật ổn định.

Như Etienne đã nói ở trên: cài đặt và chạy với điều này:

$ npm install -g npm-check-updates
$ npm-check-updates -u
$ npm install 

34
2018-02-11 23:37



rm -rf node_modules trước npm install đã loại bỏ một số cảnh báo phụ thuộc đối với tôi. - Michael Cole
Chỉ trong trường hợp bạn có "*" trong package.json, chỉ cần thay đổi nó thành "0" hoặc "0.0" hoặc "0.0.0" trước khi chạy npm-check-updates. - igorpavlov
Đây là cách dễ nhất để làm điều đó. Không có rắc rối không rassle. Làm việc như một say mê. Tất cả deps của bạn được cập nhật và cài đặt đúng cách. Cám ơn - Yoraco Gonzales


Để xem gói nào có phiên bản mới hơn, hãy sử dụng lệnh sau:

npm outdated

để cập nhật một phụ thuộc chỉ sử dụng lệnh sau:

npm install yourPackage@latest --save

Ví dụ:

Của tôi package.json tệp có phụ thuộc:

"@progress/kendo-angular-dateinputs": "^1.3.1",

sau đó tôi nên viết:

npm install @progress/kendo-angular-dateinputs@latest --save

24
2017-12-07 07:01



Đẹp nhưng có vẻ như --save (hoặc --save-dev) không bắt buộc phải cập nhật. - Burrich