2016-12-10 5 views
8

Ich möchte mit yarn install statt npm install erzwingen. Ich möchte einen Fehler in npm install auslösen. Was soll ich in package.json tun?Force-Garn installieren statt Npm installieren für Node-Modul?

+0

Welche Fehler Sie konfrontiert sind mit ** npm installieren * * –

+0

Es ist wahrscheinlich kein Fehler, dem er gegenübersteht, sondern der Wunsch, sicherzustellen, dass sein gesamtes Team Garn verwendet. Garn behebt viele Probleme, die durch npm verursacht werden, wenn man an einem Team arbeitet. –

Antwort

11

In Ihrem Preinstall-Skript können Sie einen Mini-Knoten-Skript ausführen, die auf allen Plattformen funktionieren sollte, während Dinge wie pgrep (und andere gemeinsame * nix-Befehle und Operatoren) funktioniert nicht unter Windows, bis Windows 10 weit verbreitet ist.

Ich habe das folgende Skript auf Knoten v4.7.0 (npm v2.15.11) und Knoten v7.2.1 (npm v3.10.10) getestet. Ich nehme an, es funktioniert auf alles dazwischen. Es prüft die Umgebungsvariablen des gerade laufenden Prozesses - npm_execpath ist der Pfad zum aktuell laufenden "npm" -Skript. Im Fall von Garn sollte es auf /path/to/yarn/on/your/machine/yarn.js zeigen.

"scripts": { 
    "preinstall": "node -e \"if(process.env.npm_execpath.indexOf('yarn') === -1) throw new Error('You must use Yarn to install, not NPM')\"" 
} 

HINWEIS: Update von Alexander's answer - das wird nicht funktionieren, wenn der Benutzer
npm install --ignore-scripts verwendet. Bitte geben Sie Kredit, wo Kredit fällig ist.

Sie können mehr über npm Skripte hier lesen: https://docs.npmjs.com/misc/scripts

Was die npm_execpath Umgebungsvariable, die zwar nicht dokumentiert ich bezweifle, dass es jemals ändern wird. Es ist für mehrere Major Releases von npm und es gibt nicht wirklich die "es gibt einen besseren Namen für diese" Test.

+0

&& ist in npm-Skripten in Ordnung, da sie von der Eingabeaufforderung ausgeführt werden, nicht Powershell. – cchamberlain

+0

Ah, danke. Ich dachte, das Windows-Äquivalent von '&&' war '&' - Ich habe mich geirrt ('&' ist das Windows-Äquivalent von ';'). Ich habe meine Antwort aktualisiert. –

+0

Die Zitate sind wichtig für Windows und geben einen Fehler, wenn Sie einfache Anführungszeichen für das Argument -e verwenden: '" preinstall ":" node -e \ "if (process.env.npm_execpath.indexOf ('Garn') == = -1) wirf einen neuen Fehler ('Du musst Garn benutzen, um zu installieren, nicht NPM') \ "" ' – Thomas

1

Sie können den preinstall Hook zusammen mit einigen Shell-Skripten verwenden, um dies zu erreichen.

Probe package.json:

"scripts": { 
    "preinstall": "pgrep npm && exit 1" 
    } 
+0

Dies funktionierte bei OSX nicht, da es falsche Positive erzeugte. Wenn Sie zum Beispiel 'pgrep npm' direkt im Terminal ausführen, wird eine Prozess-ID zurückgegeben, weil ich zufällig einen Server habe, der mit einem npm-Skript gestartet wurde. –

2

Wie die anderen Antworten, empfehle ich die Verwendung einer preinstall script und Überprüfung Ihrer Umgebung. Für eine portable Lösung, die keine Fehlalarme hat, wenn ein anderer npm-Prozess läuft, ist die Verwendung von node -e 'JS_CODE' wahrscheinlich die beste Option.

In diesem JS-Code, können Sie den Paket-Manager den Weg mit dem folgenden überprüfen:

process.env.npm_execpath 

Yarn des binären yarn.js ist, im Vergleich zu npm-cli.js von NPM verwendet. Wir können eine Regex wie die folgende verwenden, um zu überprüfen, dass diese Zeichenfolge mit yarn.js endet.

/yarn\.js$/ 

dieses Regex verwenden, können wir sicher sein, sie nicht versehentlich irgendwo früher im Dateisystem übereinstimmen. Höchstwahrscheinlich yarn wird nicht im Dateipfad angezeigt, aber Sie können nie zu sicher sein.

Hier ist ein minimales Beispiel:

{ 
    "name": "test", 
    "version": "1.0.0", 
    "scripts": { 
    "preinstall": "node -e 'if(!/yarn\\.js$/.test(process.env.npm_execpath))throw new Error(\"Use yarn\")'" 
    } 
} 

Natürlich wird der Benutzer noch in der Lage sein, um dies zu überprüfen bekommen die JSON werden Bearbeitung oder die --ignore-scripts Optionen:

npm install --ignore-scripts