Meine Frage ähnelt dieser.
Ein Projekt ist von einem Git-Modul abhängig, das sich in einem privat gehosteten Repository befindet:
"dependencies": {
"mymod": "git+https://mygitserver:8443/scm/od/mymod.git",
...
}
Die Absicht ist, dass es sich dabei um eine Snapshot-Abhängigkeit handelt, also wann auch immer mymod
Wenn der Code geändert wird, ruft das Projekt die neueste Version ab.
Die Frage ist: Welchen Befehl sollte ich richtig verwenden, um mein Projekt auf die neueste Version des Moduls zu aktualisieren?
Das Einzige, was meiner Meinung nach funktioniert, ist:
rm -rf node_modules/mymod
npm install
Betrieb npm install
allein bewirkt nichts (vorausgesetzt, es wurde bereits einmal ausgeführt), wie @Vishwanath in seiner Frage anmerkte, da das Modul bereits installiert ist. npm upgrade
ist unangemessen, da ich auch von vielen anderen Modulen abhängig bin und nicht alle auf neuere Versionen aktualisieren möchte.
Ich schätze, ich könnte explizit versionieren mymod
und dann mein lokales aktualisieren package.json
mit der neuen Version, wann immer diese sich ändert, aber das führt zu einer laufenden Wartungsaufgabe.
Wie es scheint npm
verfügt über genügend Informationen, um festzustellen, wann ein Upgrade erforderlich ist, weil node_modules/mymod/package.json
enthält die letzte bekannte Kopfrevision, die mit der aktuellen Kopfrevision verglichen werden könnte:
"gitHead": "b63f0df8ef...",
"_resolved": "git+https://mygitserver:8443/scm/od/mymod.git#b63f0df8ef..."
Tut npm
Haben Sie eine bevorzugte Möglichkeit, solche Snapshot-Abhängigkeiten zu handhaben?
UPDATE – 2021 – privates Paket in Entwicklung und Produktion
In meinem neuen Projekt habe ich mein Bestes gegeben, um meinen Code so zu schreiben, dass er mit minimalen Änderungen sowohl in die Produktion als auch in die Entwicklung passt. Die Arbeit mit meinem privaten Paket war eine der Herausforderungen.
Ich wollte lokal an meinem Paket arbeiten, damit alle Änderungen sofort übernommen werden, ohne mein Paket jedes Mal manuell aktualisieren zu müssen, wie in der folgenden Lösung, aber in der Produktion wollte ich, dass es eine bestimmte Version des Pakets von meinem Git installiert, wenn Das tue ich npm install
.
Also habe ich zwei verschiedene Abhängigkeiten verwendet, eine für die Produktion und eine für die Entwicklung
package.json
:
"dependencies": {
"package-name": "git+ssh://[email protected]:*git package/path*.git#1.0.0",
},
"devDependencies": {
"package-name-dev": "file:*package path*"
}
Jetzt, nachdem ich beide Pakete habe, muss ich in der Entwicklung jedes Mal das Dev-Paket verwenden, wenn ich das Hauptpaket aufrufe, anstatt viele Dinge zu tun if(isDev){...}
über alle meine Dateien.
Ich habe das verwendet Modulalias Paket, das es mir ermöglicht, einem Modul einmal einen Alias zuzuweisen, und es wird für das gesamte Projekt angewendet.
oben app.js
:
const isDev = (process.env.NODE_ENV === 'development'),
isProd = (process.env.NODE_ENV === 'production');
if (isDev) {
const moduleAlias = require('module-alias');
moduleAlias.addAlias('package-name', 'package-name-dev');
}
Und das ist es, jetzt, wann immer ich const pack = require('package-name')
wird für die Entwicklung das lokale Paket (dev) und für die Produktion das Hauptpaket benötigt.
Notiz – Im Hauptpaket habe ich am Ende meiner Git-URL ein Tag (#1.0.0) verwendet. Ich verwende dasselbe Paket für mehrere meiner Projekte und wollte sicherstellen, dass ich die Version meines Pakets pro Projekt kontrolliere , sodass ich die neueste Version manuell in älteren Projekten testen kann und nichts kaputt geht.
URSPRÜNGLICHE ANTWORT – Pakete manuell aktualisieren
Ich konnte keinen besseren Weg dafür finden und habe am Ende ein Skript hinzugefügt package.json
dass ich das Paket, das ich benötige, manuell installiere.
Fügen Sie ein Skript hinzu package.json
Dadurch wird das benötigte Paket aktualisiert:
"scripts": {
"update:packages": "npm install git+ssh://git@GIT_URL_HERE#master"
}
Dies ist zwar dasselbe wie das manuelle Aktualisieren des Pakets, wie @chris in den Kommentaren der anderen Antwort sagte, aber dies ist viel einfacher und kann verwendet werden mit:
npm run update:packages
NOTIZ – Der #master
Das Tag am Ende installiert den Master-Zweig, was nicht optimal ist, aber es ermöglicht Ihnen, die letzte Version des Pakets zu installieren, ohne das Tag jedes Mal manuell zu ändern.
Aktualisieren – Wenn Sie dies für die Entwicklung benötigen und das Paket im privaten Repository etwas ist, an dem Sie lokal arbeiten (wie ich), können Sie das Paket einfach mit dem Projekt verknüpfen. Alle Änderungen werden sofort angezeigt, ohne dass eine Neuinstallation erforderlich ist. Weitere Infos unter Link:
cd /path/to/working/dir
npm link ../path/to/package/dir
Update 2
Wenn Sie Docker verwenden, npm link
wird im Docker nicht funktionieren, das liegt daran link
setzt einen Softlink zu Ihrem lokalen npm-Ordner. Um dies zu vermeiden, müssen Sie den Softlink festlegen innen der Hafenarbeiter.
Sie können ein Paket manuell aktualisieren.
npm update mymod
Dadurch wird Ihre package-lock.json mit dem neuesten Hash-Commit aktualisiert.
Ich habe versucht, die Versionsnummer in package.json zu aktualisieren, aber das Paket wird immer noch nicht aktualisiert. Die einzige Möglichkeit scheint darin zu bestehen, jedes Mal das alte Paket zu löschen.
Ich habe meine package.json-Datei in etwas wie dieses geändert, was gut funktioniert hat
"scripts": {
.......
"updateGit": "npm uninstall PACKAGE-NAME && npm install git+https://github.com/..../PACKAGE-NAME.git"
},
Dann
npm run updateGit
Sie müssen die Version in package.json in mymod aktualisieren, damit npm den aktualisierten Code installiert.
Etwas besser als das Löschen des lokalen Moduls ist es, den expliziten Installationsbefehl erneut auszuführen:
npm install "git+https://mygitserver:8443/scm/od/mymod.git"
– Chris
24. Februar 2016 um 9:52 Uhr