Sprawdź npm i zaktualizuj pakiet w razie potrzeby


471

Musimy zintegrować testera Karmy z TeamCity i do tego chciałbym dać inżynierom sys mały skrypt (PowerShell lub cokolwiek), który:

  1. wybierz pożądany numer wersji z pliku konfiguracyjnego (chyba mogę go wstawić jako komentarz bezpośrednio w karma.conf.js)

  2. sprawdź, czy zdefiniowana wersja karma runnera jest zainstalowana w globalnym repozytorium npm

  3. jeśli nie, lub zainstalowana wersja jest starsza niż pożądana: wybierz i zainstaluj odpowiednią wersję

  4. Uruchom: karma start .\Scripts-Tests\karma.conf.js --reporters teamcity --single-run

Tak więc moje prawdziwe pytanie brzmi: „jak można sprawdzić skrypt, jeśli zainstalowana jest żądana wersja pakietu?”. Czy należy to sprawdzić, czy bezpiecznie jest po prostu zadzwonić npm -g installza każdym razem?

Nie chcę zawsze sprawdzać i instalować najnowszej dostępnej wersji, ponieważ inne wartości konfiguracji mogą być niezgodne

Odpowiedzi:


609

Aby sprawdzić, czy jakikolwiek moduł w projekcie jest „stary”:

npm outdated

nieaktualny ” sprawdzi każdy zdefiniowany moduł package.jsoni sprawdzi, czy w rejestrze NPM jest nowsza wersja.

Na przykład powiedzmy xml2js 0.2.6(znajduje się w node_modulesbieżącym projekcie) jest nieaktualny, ponieważ istnieje nowsza wersja (0.2.7). Zobaczyłbyś:

xml2js@0.2.7 node_modules/xml2js current=0.2.6

Aby zaktualizować wszystkie zależności, jeśli masz pewność, jest to pożądane:

npm update

Lub, aby zaktualizować jedną zależność, taką jak xml2js:

npm update xml2js

6
Zachowaj ostrożność, npm updateszczególnie jeśli npm update -g... nie robi tego większość groszku! Zobacz: github.com/npm/npm/issues/6247 i gist.github.com/othiym23/4ac31155da23962afd0e
jbandi

6
@jbandi Począwszy od npm@2.6.1, npm -g updatemożna bezpiecznie używać ponownie. github.com/npm/npm/issues/6247#issuecomment-92182814
Chuck Le Butt

7
Należy pamiętać, że aktualizacja npm nie zaktualizuje pliku package.json zgodnie z odpowiedzią @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 outdatedzidentyfikuje pakiety, które powinny zostać zaktualizowane, i npm update <package name>można ich użyć do aktualizacji każdego pakietu. Ale przed npm@5.0.0 npm update <package name>nie zaktualizuje wersji w pakiecie.json, co jest problemem.

Najlepszy przepływ pracy to:

  1. Zidentyfikuj nieaktualne pakiety
  2. Zaktualizuj wersje w pliku package.json
  3. Uruchom, npm updateaby zainstalować najnowsze wersje każdego pakietu

Sprawdź, npm-check-updatesaby pomóc w tym przepływie pracy.

  • Zainstaluj npm-check-updates
  • Uruchom, npm-check-updatesaby wyświetlić listę nieaktualnych pakietów (w zasadzie to samo, co uruchomienie npm outdated)
  • Uruchom, npm-check-updates -uaby zaktualizować wszystkie wersje w pakiecie.json (jest to magiczny sos)
  • Uruchom npm updatejak zwykle, aby zainstalować nowe wersje swoich pakietów w oparciu o zaktualizowany pakiet.json

3
npm outdatedpokaże WSZYSTKIE pakiety .. nawet w innych pakietach .. ale te nie zostaną zaktualizowane dzięki tej procedurze, więc zawsze będą się pojawiać .. więc po prostu użyj npm-check-updates(tak jak naprawdę zaleciłeś), który pokazuje tylko główne pakiety z package.json... to jest istotne
davidhq

W przypadku przędzy jest to o wiele łatwiejsze, wystarczy wpisać „upgrade przędzy”.
Christopher Grigg,

17
Dlaczego muszę zainstalować menedżera aktualizacji, aby zarządzać moim menedżerem pakietów? Czy nie zgadzamy się, że to głupie? Powinno być tak proste, npm install --all-outdatedale nie jest ...
ADJenks

3
Zawsze możesz uruchomić, npm update --save package_nameaby zapisać najnowszą zmianę w pliku package.json.
trungk18

Erik, czy możesz uprzejmie odpowiedzieć na to powiązane pytanie SO , ponieważ nadal jest dla mnie nieco myląca różnica między obiema komendami, to jest npm updatevs npm-check-updates?
João Pimentel Ferreira

146

Istnieje również „świeży” moduł o nazwie npm-check:

sprawdź npm

Sprawdź, czy istnieją nieaktualne, niepoprawne i nieużywane zależności.

wprowadź opis zdjęcia tutaj

Zapewnia również wygodny interaktywny sposób aktualizacji zależności.


78

Jeden prosty krok:

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

To wszystko. Wszystkie wersje pakietu wpackage.json będą najnowszymi wersjami głównymi.

Edytować:

Co tu się dzieje?

  1. Instalowanie pakietu, który sprawdza aktualizacje.

  2. Użyj tego pakietu, aby zaktualizować wszystkie wersje pakietu w swoim package.json(-u to skrót od --updateAll).

  3. Zainstaluj wszystkie nowe wersje pakietów.


3
@imnickvaughn ncuoznacza aktualizacje sprawdzania węzłów i -ajest opcją „upgradeAll”. Znajdź wszystkie opcje tutaj: npmjs.com/package/npm-check-updates
Arian Acosta

A jeśli chcę to zrobić w jednej linii bez użycia innego pakietu, takiego jak ncu?
ADJenks

Lub bez globalnej instalacji,npx -p npm-check-updates ncu -u
entozoon

68
  • Aby zaktualizować pojedynczy pakiet lokalny:

    1. Najpierw sprawdź swoje nieaktualne pakiety:

      npm outdated

    2. Następnie zaktualizuj pakiet lub pakiety, które chcesz ręcznie, jako:

      npm update --save package_name

W ten sposób aktualizacja package.json pliku lokalnego nie jest konieczna .

Pamiętaj, że spowoduje to zaktualizowanie pakietu do najnowszej wersji.

  • Jeśli napiszesz jakąś wersję w swoim package.jsonpliku i wykonaj:

    npm update package_name

    W takim przypadku otrzymasz tylko następną (stabilną) wersję stabilną dotyczącą wersji zapisanej w package.jsonpliku.

Dzięki npm list (package_name)niemu możesz znaleźć aktualną wersję swoich lokalnych pakietów.


14

Komendy NPM do aktualizacji lub naprawy luk w niektórych plikach manifestu zależności

  • Użyj poniższego polecenia, aby sprawdzić nieaktualne lub luki w zabezpieczeniach modułów węzła.

    npm audit

  • Jeśli zostaną wykryte jakiekolwiek luki, użyj poniższego polecenia, aby naprawić wszystkie problemy.

    npm audit fix

  • Jeśli to nie działa, spróbuj

    npm audit fix -f, to polecenie prawie naprawi wszystkie luki w zabezpieczeniach. Niektóre zależności lub devDependencies są zablokowane w pliku package-lock.json , więc używamy -fflagi, aby wymusić ich aktualizację.

  • Jeśli nie chcesz używać wymuszonej kontroli audytu, możesz ręcznie naprawić wersje zależności, zmieniając je w pliku package-lock.json i package.json . Następnie uruchomić

npm update && npm upgrade



10

Brak dodatkowych pakietów, aby po prostu sprawdzić nieaktualne i zaktualizować te, które są, to polecenie wykona:

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


Dobra robota, dzięki!
drKreso

To świetna odpowiedź, ponieważ można ją umieścić w dowolnym skrypcie powłoki, aby zautomatyzować ten krok bez konieczności instalowania dodatkowego pakietu.
Jankapunkt

4

Podczas instalowania pakietów npm (globalnie lub lokalnie) możesz zdefiniować konkretną wersję, używając @versionskładni do zdefiniowania wersji do zainstalowania.

Innymi słowy, wykonanie: npm install -g karma@0.9.2 upewni się, że zainstalowana jest tylko wersja 0.9.2 i nie zostanie ponownie zainstalowana, jeśli już istnieje.

Jako rada, sugeruję unikanie globalnych instalacji npm, gdziekolwiek możesz. Wiele osób nie zdaje sobie sprawy, że jeśli zależność definiuje plik bin, zostaje on zainstalowany na ./node_modules/.bin/. Często bardzo łatwa w użyciu jest lokalna wersja zainstalowanego modułu zdefiniowanego w pliku package.json. W rzeczywistości skrypty npm dodają ./node_modules/.bin do twojej ścieżki.

Jako przykład, oto pakiet.json, który po uruchomieniu npm install && npm testzainstaluje wersję karmy zdefiniowaną w moim pakiecie.json i użyje tej wersji karmy (zainstalowanej w node_modules / .bin / karma) podczas uruchamiania testskryptu:

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

Daje to korzyść z pliku package.json definiującego wersję karmy do użycia i bez konieczności utrzymywania tej konfiguracji globalnie na twoim polu CI.


co jest w testskrypcie? Czy możesz mi podać, jak zainstalować go za pomocą skryptu.
iLemming

1
Spójrz na package.json. We właściwości „scripts” możesz zdefiniować inną właściwość, „test”, której wartością jest polecenie, które chcesz uruchomić podczas pisania npm test. Dokumenty
addisonj

4

Począwszy od npm@5.0.0+ , możesz po prostu zrobić:

npm update <package name>

Spowoduje to automatyczną aktualizację package.jsonpliku. Nie musimy ręcznie aktualizować najnowszej wersji, a następnie używaćnpm update <package name>

Nadal możesz uzyskać stare zachowanie za pomocą

npm update --no-save

( Odniesienie )


1

Aby naprawdę zaktualizować tylko jeden pakiet, zainstaluj NCU, a następnie uruchom go tylko dla tego pakietu. Spowoduje to wzrost do najnowszej wersji.

npm install -g npm-check-updates

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

6
Post o niskiej jakości, pomocne może być lepsze wyjaśnienie.
linuxfan mówi: Przywróć Monikę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.