2015-06-05 38 views
16

Kann das Paket npm nur installiert werden, wenn es noch nicht installiert wurde?Kann das npm-Paket nur installiert werden, wenn es noch nicht installiert wurde?

Ich brauche diesen Test auf CircleCI zu beschleunigen, aber wenn ich npm install [email protected] laufen usw. es immer herunterlädt Dinge und installiert sie von scracth, node_modules Ordner mit allen Modulen ist jedoch bereits im Zeitpunkt der Ausführung von Befehlen (gecached aus vorheriger Build) und protractor --version usw. zeigt die benötigte Version des Pakets an.

Seine perfekte einige einzeiligen Befehl wie diese haben:

protractor --version || npm install -g [email protected] 

aber derjenige, der auch Version des Pakets überprüfen.

+0

'[-d path/to/Transporteur] || npm installieren ... '? – bishop

+3

'Befehl -v Winkelmesser>/dev/null 2> & 1 || npm installieren ... '? – bishop

+0

Ich muss die Version des aktuell installierten Pakets überprüfen, vorzugsweise nicht den vollständigen Pfad zum Paket schreiben. mehrere verschiedene Umgebungen, verschiedene Pfade usw. – kovpack

Antwort

17

mit bash können Sie

[ $(node -p "require('protractor/package.json').version") != "2.1.0" ] && npm install [email protected] 
+0

Perfekt! Danke! – kovpack

+4

Fast perfekt, wie es gerade herausgekommen ist. Es wird eine Ausnahme ausgelöst, wenn das Paket nicht vorhanden ist. – kovpack

7

Funktion Version des ausgezeichneten answer by @JeromeWAGNER tun:

function install_package_if_needed() { 
    local p=${1:-Package required} 
    local v=${2:-Version required} 
    shift 2 
    local i=$(node -p "require('$p/package.json').version" 2>/dev/null) 
    [ "$i" == "$v" ] || npm "[email protected]" install "[email protected]$v" 
} 

Verwendung wie:

$ install_package_if_needed protractor 2.1.0 

Um zusätzliche Optionen npm geben, geben Sie diese nach die Version, so:

+0

Yeap, danke. Ich habe so etwas gemacht, aber mehrere Systembefehle von Ruby aufgerufen. Aber genau diese Version ist für meine Aufgabe nicht anwendbar. – kovpack

+0

Danke dafür. Aber benötigt um>/dev/null else $ i zu entfernen, wird immer leer sein. –

+0

@DarylTeo Danke! Du hast recht. Nicht sicher, was ich dachte. Fest! – bishop

0

Ich hatte dieses Problem zusammen mit dem Wunsch, globale Abhängigkeiten von jeder "package.json" -Datei zu installieren, die sie benötigt.

Dies ist für eine Windows-Entwicklungsumgebung.

Here is my solution.

2
[ $(node -p "try{require('protractor/package.json').version}catch(e){}") != "2.1.0" ] && npm install grunt 
3

Sie könnten npm list protractor || npm install [email protected]

versuchen Wo npm list protractor verwendet wird protractor Paket zu finden.

Wenn das Paket nicht gefunden wird, wird es npm ERR! code 1 zurückkehren und tun npm install [email protected] für die Installation

Verwandte Themen