Es ist in der Tat möglich, npm programmgesteuert zu verwenden, und dies wurde in älteren Revisionen der Dokumentation beschrieben. Es wurde inzwischen aus der offiziellen Dokumentation entfernt, existiert jedoch weiterhin in der Quellcodeverwaltung mit der folgenden Aussage:
Obwohl npm programmgesteuert verwendet werden kann, ist seine API nur für die Verwendung durch die CLI vorgesehen, und es werden keine Garantien hinsichtlich seiner Eignung für andere Zwecke gegeben. Wenn Sie npm verwenden möchten, um eine Aufgabe zuverlässig auszuführen, ist es am sichersten, den gewünschten npm-Befehl mit den entsprechenden Argumenten aufzurufen.
Die semantische Version von npm bezieht sich eher auf die CLI selbst als auf die zugrunde liegende API. Es ist nicht garantiert, dass die interne API stabil bleibt, selbst wenn die Version von npm angibt, dass laut Semver keine wesentlichen Änderungen vorgenommen wurden .
In der Originaldokumentation wurde das folgende Codebeispiel bereitgestellt:
var npm = require('npm')
npm.load(myConfigObject, function (er) {
if (er) return handlError(er)
npm.commands.install(['some', 'args'], function (er, data) {
if (er) return commandFailed(er)
// command succeeded, and data might have some info
})
npm.registry.log.on('log', function (message) { ... })
})
Da npm im node_modules
Ordner vorhanden ist, können Sie require('npm')
ihn wie jedes andere Modul laden. Um ein Modul zu installieren, möchten Sie verwenden npm.commands.install()
.
Wenn Sie in der Quelle suchen müssen, dann ist es auch auf GitHub . Hier ist ein vollständiges Arbeitsbeispiel für den Code, der dem Ausführen npm install
ohne Befehlszeilenargumente entspricht:
var npm = require('npm');
npm.load(function(err) {
// handle errors
// install module ffi
npm.commands.install(['ffi'], function(er, data) {
// log errors or data
});
npm.on('log', function(message) {
// log installation progress
console.log(message);
});
});
Beachten Sie, dass das erste Argument für die Installationsfunktion ein Array ist. Jedes Element des Arrays ist ein Modul, das npm zu installieren versucht.
Eine erweiterte Verwendung finden Sie in der npm-cli.js
Datei zur Quellcodeverwaltung.
npm install npm --save
zuerst tun . Beispiel funktioniertnpm
gibt viele Abhängigkeiten. Wenn Sie es also zu Ihrem Modul hinzufügen , dauert das Herunterladen höchstwahrscheinlich VIEL länger. Schauen Sie sich eine derchild_process
Antworten an, um die globale npm zu nutzen, die bereits auf den Computern Ihrer Benutzer installiert ist.npm.config
annpm.load
! Selbst @isaacs weiß nicht, was für seltsame Dinge dann passieren werden! Siehe github.com/npm/npm/issues/4861#issuecomment-40533836 Stattdessen können Sie einfach das erste Argument überspringen.process.cwd()
)Ja. Mit child_process können Sie einen Systembefehl ausführen
quelle
npm.cmd
stattdessen anrufen .Um auch die Ausgabe zu sehen, können Sie Folgendes verwenden:
Auf diese Weise können Sie die Installation wie manuell ansehen und Überraschungen wie vollen Puffer usw. vermeiden.
quelle
es kann tatsächlich ein bisschen einfach sein
quelle
Ich hatte verdammt viel Zeit damit, das erste Beispiel in einem Projektverzeichnis zum Laufen zu bringen und hier zu posten, falls jemand anderes dies findet. Soweit ich das beurteilen kann, funktioniert NPM immer noch gut, wenn es direkt geladen wird. Da jedoch CLI vorausgesetzt wird, müssen wir uns ein wenig wiederholen, um es einzurichten:
quelle
pacote ist das Paket, mit dem npm Paketmetadaten und Tarballs abruft. Es hat eine stabile, öffentliche API.
quelle
Ich bin der Autor eines Moduls, mit dem Sie genau das tun können, was Sie sich vorgestellt haben. Siehe Live-Plugin-Manager .
Sie können praktisch jedes Paket von NPM, Github oder aus einem Ordner installieren und ausführen.
Hier ein Beispiel:
Im obigen Code installiere ich das
moment
Paket zur Laufzeit, lade es und führe es aus. Am Ende deinstalliere ich es.Intern
npm
starte ich nicht cli, sondern lade Pakete herunter und laufe in einer Node-VM-Sandbox.quelle
Eine großartige Lösung von @hexacyanide, aber es stellte sich heraus, dass NPM kein "log" -Ereignis mehr ausgibt (zumindest ab Version 6.4.1). Stattdessen verlassen sie sich auf ein eigenständiges Modul https://github.com/npm/npmlog . Glücklicherweise ist es ein Singleton, sodass wir dieselbe Instanz erreichen können, die NPM für Protokolle verwendet, und Protokollereignisse abonnieren können:
Wie Sie dem Code entnehmen können, gibt NPM auch Leistungsmetriken für den Code aus,
process
sodass wir ihn auch zur Überwachung des Fortschritts verwenden können.quelle
Eine andere Option, die hier nicht erwähnt wurde, ist das Ausführen und Ausführen von CLI direkt von
./node_modules/npm/bin/npm-cli.js
Beispielsweise möchten Sie in der Lage sein, Knotenmodule vom ausgeführten Skript auf einem Computer zu installieren, auf dem NPM nicht installiert ist. Und Sie möchten es mit CLI tun. In diesem Fall installieren Sie NPM einfach lokal in Ihren node_modules, während Sie Ihr Programm erstellen (
npm i npm
).Dann benutze es so:
Dann könnte Ihr Programm sogar in eine Binärdatei gepackt werden, zum Beispiel mit einem PKG- Paket. In diesem Fall müssen Sie die
--ignore-scripts
Option npm verwenden, da Node-Gyp zum Ausführen von Vorinstallationsskripten erforderlich istquelle