kiểm tra và cập nhật gói npm nếu cần


471

Chúng tôi cần tích hợp nhân vật chạy thử nghiệm Karma vào TeamCity và vì thế tôi muốn đưa ra kịch bản nhỏ của sys-kỹ sư (powershell hoặc bất cứ thứ gì) có thể:

  1. lấy số phiên bản mong muốn từ một số tệp cấu hình (tôi đoán tôi có thể đặt nó làm nhận xét ngay trong phần karma.conf.js)

  2. kiểm tra xem phiên bản đã xác định của người chạy nghiệp được cài đặt trong repo toàn cầu của npm

  3. nếu không, hoặc phiên bản đã cài đặt cũ hơn mong muốn: chọn và cài đặt đúng phiên bản

  4. chạy nó: karma start .\Scripts-Tests\karma.conf.js --reporters teamcity --single-run

Vì vậy, câu hỏi thực sự của tôi là: "làm thế nào người ta có thể kiểm tra tập lệnh, nếu phiên bản gói mong muốn được cài đặt?". Bạn có nên kiểm tra không, hay chỉ an toàn khi gọi npm -g installmọi lúc?

Tôi không muốn luôn luôn kiểm tra và cài đặt phiên bản mới nhất có sẵn, vì các giá trị cấu hình khác có thể không tương thích

Câu trả lời:


609

Để kiểm tra xem có bất kỳ mô-đun nào trong dự án là 'cũ' không:

npm outdated

' lỗi thời ' sẽ kiểm tra mọi mô-đun được xác định trong package.jsonvà xem liệu có phiên bản mới hơn trong sổ đăng ký NPM không.

Ví dụ: giả sử xml2js 0.2.6(nằm trong node_modulesdự án hiện tại) đã lỗi thời vì tồn tại phiên bản mới hơn (0.2.7). Bạn sẽ thấy:

xml2js@0.2.7 node_modules/xml2js current=0.2.6

Để cập nhật tất cả các phụ thuộc, nếu bạn tự tin thì điều này là mong muốn:

npm update

Hoặc, để cập nhật một phụ thuộc duy nhất, chẳng hạn như xml2js:

npm update xml2js

6
Hãy cẩn thận với npm updateđặc biệt là với npm update -g... đó không phải là điều mà hầu hết các hạt đậu mong đợi! Xem: github.com/npm/npm/issues/6247gist.github.com/othiym23/4ac31155da23962afd0e
jbandi

6
@jbandi Kể từ npm@2.6.1, npm -g updatean toàn để sử dụng lại. github.com/npm/npm/issues/6247#issuecomment-92182814
Chuck Le Mông

7
Xin lưu ý rằng cập nhật npm sẽ không cập nhật tệp pack.json của bạn như được nêu trong câu trả lời từ @Erik Olson.
Ehtesham Hasan

5
As of npm@5.0.0, 'npm update' will change package.json to save the new version as the minimum required dependency docs.npmjs.com/cli/update.html
Sidney

368

npm outdatedsẽ xác định các gói cần được cập nhật và npm update <package name>có thể được sử dụng để cập nhật từng gói. Nhưng trước npm@5.0.0, npm update <package name>sẽ không cập nhật các phiên bản trong gói.json của bạn, đây là một vấn đề.

Quy trình làm việc tốt nhất là:

  1. Xác định các gói hết hạn
  2. Cập nhật các phiên bản trong gói.json của bạn
  3. Chạy npm updateđể cài đặt các phiên bản mới nhất của mỗi gói

Kiểm tra npm-check-updatesđể giúp với quy trình công việc này.

  • Cài đặt npm-check-update
  • Chạy npm-check-updatesđể liệt kê các gói đã hết hạn (về cơ bản giống như chạy npm outdated)
  • Chạy npm-check-updates -uđể cập nhật tất cả các phiên bản trong gói.json của bạn (đây là nước sốt ma thuật)
  • Chạy npm updatenhư bình thường để cài đặt các phiên bản mới của các gói của bạn dựa trên gói.j.j được cập nhật

3
npm outdatedsẽ hiển thị TẤT CẢ các gói .. ngay cả trong các gói khác .. nhưng các gói đó sẽ không được cập nhật với quy trình này để chúng luôn xuất hiện .. vì vậy chỉ cần sử dụng npm-check-updates(như bạn thực sự khuyến nghị) chỉ hiển thị các gói chính từ package.json... điều này có liên quan
davidhq

Với sợi, điều này dễ dàng hơn nhiều chỉ cần gõ 'nâng cấp sợi'.
Christopher Grigg

17
Tại sao tôi phải cài đặt trình quản lý cập nhật để quản lý trình quản lý gói của mình? Chúng tôi không đồng ý điều này là ngớ ngẩn? Nó sẽ đơn giản như npm install --all-outdatednhưng nó không ...
ADJenks

3
Bạn luôn có thể chạy npm update --save package_nameđể lưu thay đổi mới nhất vào pack.json.
trungk18

Erik, bạn có thể vui lòng trả lời câu hỏi SO liên quan này không , bởi vì nó vẫn hơi khó hiểu với tôi về sự khác biệt giữa cả hai lệnh, nghĩa là npm updateso với npm-check-updates?
João Pimentel Ferreira

146

Ngoài ra còn có một mô-đun "tươi" được gọi là npm-check:

kiểm tra npm

Kiểm tra các phụ thuộc lỗi thời, không chính xác và không sử dụng.

nhập mô tả hình ảnh ở đây

Nó cũng cung cấp một cách tương tác thuận tiện để cập nhật các phụ thuộc.


78

Một bước dễ dàng:

$ npm i -g npm-check-updates && ncu -u && npm i

Đó là tất cả. Tất cả các phiên bản gói trong package.jsonsẽ là phiên bản chính mới nhất.

Biên tập:

Có chuyện gì đang xảy ra ở đây?

  1. Cài đặt gói kiểm tra cập nhật cho bạn.

  2. Sử dụng gói này để cập nhật tất cả các phiên bản gói trong package.json(-u là viết tắt của --update ALL).

  3. Cài đặt tất cả các phiên bản mới của các gói.


3
@imnickvaughn nculà viết tắt của nút kiểm tra cập nhật và -alà tùy chọn 'nâng cấp Tất cả'. Tìm tất cả các tùy chọn ở đây: npmjs.com/package/npm-check-updates
Arian Acosta

Và nếu tôi muốn làm điều đó trong một dòng mà không sử dụng gói khác như ncu thì sao?
ADJenks

Hoặc không có cài đặt toàn cầu,npx -p npm-check-updates ncu -u
entozoon

68
  • Để cập nhật một gói cục bộ duy nhất:

    1. Trước tiên hãy tìm hiểu các gói lỗi thời của bạn:

      npm outdated

    2. Sau đó cập nhật gói hoặc gói mà bạn muốn theo cách thủ công như:

      npm update --save package_name

Bằng cách này, không cần thiết phải cập nhật package.json tệp cục bộ của bạn .

Lưu ý rằng điều này sẽ cập nhật gói của bạn lên phiên bản mới nhất.

  • Nếu bạn viết một số phiên bản trong package.jsontập tin của bạn và làm:

    npm update package_name

    Trong trường hợp này, bạn sẽ chỉ nhận được phiên bản ổn định tiếp theo (muốn) liên quan đến phiên bản mà bạn đã viết trong package.jsontệp của mình .

Và với npm list (package_name)bạn có thể tìm ra phiên bản hiện tại của các gói địa phương của bạn.


14

Các lệnh NPM để cập nhật hoặc sửa các lỗ hổng trong một số tệp kê khai phụ thuộc

  • Sử dụng lệnh dưới đây để kiểm tra lỗi thời hoặc lỗ hổng trong các mô-đun nút của bạn.

    npm audit

  • Nếu có bất kỳ lỗ hổng nào được tìm thấy, hãy sử dụng lệnh bên dưới để khắc phục tất cả các vấn đề.

    npm audit fix

  • Nếu nó không hiệu quả với bạn thì hãy thử

    npm audit fix -f, lệnh này sẽ gần như sửa chữa tất cả các lỗ hổng. Một số phụ thuộc hoặc devDependencies bị khóa trong tệp pack-lock.json , vì vậy chúng tôi sử dụng -fcờ để buộc cập nhật chúng.

  • Nếu bạn không muốn sử dụng vũ lực sửa chữa kiểm toán sau đó bạn có thể tự sửa chữa các phiên bản phụ thuộc của bạn bằng cách thay đổi chúng trong gói-lock.jsonpackage.json tập tin. Sau đó chạy

npm update && npm upgrade



10

Không có gói bổ sung nào, để chỉ kiểm tra lỗi thời và cập nhật những gói đã bị, lệnh này sẽ thực hiện:

npm install $(npm outdated | cut -d' ' -f 1 | sed '1d' | xargs -I '$' echo '$@latest' | xargs echo)


Người đàn ông thứ tốt, cảm ơn!
drKreso

Đây là một câu trả lời tuyệt vời vì nó có thể được đặt trong bất kỳ tập lệnh shell nào để tự động hóa bước này mà không cần phải cài đặt thêm gói nào.
Jankapunkt

4

Khi cài đặt các gói npm (cả trên toàn cầu hoặc cục bộ), bạn có thể xác định một phiên bản cụ thể bằng cách sử dụng @versioncú pháp để xác định phiên bản sẽ được cài đặt.

Nói cách khác, làm: npm install -g karma@0.9.2 sẽ đảm bảo rằng chỉ có 0.9.2 được cài đặt và sẽ không cài đặt lại nếu nó đã tồn tại.

Theo lời khuyên, tôi khuyên bạn nên tránh cài đặt npm toàn cầu bất cứ nơi nào bạn có thể. Nhiều người không nhận ra rằng nếu một phụ thuộc xác định tệp bin, nó sẽ được cài đặt thành ./node_modules/.bin/. Thông thường, rất dễ sử dụng phiên bản cục bộ của mô-đun đã cài đặt được xác định trong gói.json của bạn. Trong thực tế, các tập lệnh npm sẽ thêm ./node_modules/.bin vào đường dẫn của bạn.

Ví dụ, đây là một gói.json, khi tôi chạy npm install && npm testsẽ cài đặt phiên bản karma được xác định trong gói.json của tôi và sử dụng phiên bản karma đó (được cài đặt tại node_modules / .bin / karma) khi chạy testtập lệnh:

{
 "name": "myApp",
 "main": "app.js",
 "scripts": {
   "test": "karma test/*",
 },
 "dependencies": {...},
 "devDependencies": {
   "karma": "0.9.2"
 }
}

Điều này mang lại cho bạn lợi ích của gói.json khi xác định phiên bản nghiệp lực sẽ sử dụng và không phải giữ cấu hình đó trên toàn cầu trên hộp CI của bạn.


những gì trong testkịch bản? Bạn có thể vui lòng cho tôi một gợi ý về cách bạn cài đặt nó với một tập lệnh.
iLemming

1
Nhìn vào gói.json. Trong thuộc tính "scripts", bạn có thể xác định một thuộc tính khác, "test" có giá trị là lệnh bạn muốn chạy khi bạn nhập npm test. tài liệu npm
addisonj

4

Kể từ npm@5.0.0+, bạn chỉ cần làm:

npm update <package name>

Điều này sẽ tự động cập nhật các package.jsontập tin. Chúng tôi không phải cập nhật phiên bản mới nhất theo cách thủ công và sau đó sử dụngnpm update <package name>

Bạn vẫn có thể có được hành vi cũ bằng cách sử dụng

npm update --no-save

( Tham khảo )


1

Để thực sự cập nhật chỉ một gói cài đặt NCU và sau đó chạy nó chỉ cho gói đó. Điều này sẽ va chạm với thực tế mới nhất.

npm install -g npm-check-updates

ncu -f your-intended-package-name -u

6
Bài chất lượng thấp, một số giải thích tốt hơn sẽ giúp.
linuxfan nói Phục hồi lại
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.