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

iLemming
źródło

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
dublx
źródło
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 [email protected], 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 [email protected], '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 [email protected] 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
Erik Olson
źródło
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.

alecxe
źródło
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.

Matt
źródło
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.

Zegarmistrz
źródło
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

Smit Patel
źródło
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)

MikeMajara
źródło
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 [email protected] 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.

addisonj
źródło
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 [email protected]+ , 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 )

adiga
źródło
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
regisbsb
źródło
6
Post o niskiej jakości, pomocne może być lepsze wyjaśnienie.
linuxfan mówi: Przywróć Monikę