Sorgen Sie dafür, dass npm das neueste Paket aus dem Git-Repo abruft

Lesezeit: 7 Minuten

Chris' Benutzer-Avatar
Chris

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?

  • 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

Benutzeravatar von Art3mix
Art3mix

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.

  • Der Punkt ist, dass es in package.json keine Versionsnummer gibt – es handelt sich um eine Snapshot-Abhängigkeit, daher sollte immer der neueste Code verwendet werden.

    – Chris

    24. Februar 2016 um 9:49 Uhr


  • Soweit ich weiß, konzentriert sich npm sehr auf Versionsnummern. Aber ich beziehe mich auf die Aktualisierung der Version in mymod, nicht in Ihrem Hauptprojekt. Können Sie mymod dazu bringen, seine Version beim Commit oder Push automatisch zu aktualisieren?

    – Anders Bornholm

    24. Februar 2016 um 9:52 Uhr

  • Ah, ich verstehe, was du meinst. Interessante Idee. Da bin ich mir zu 99 % sicher npm install stellt nicht einmal eine Verbindung zum Git-Server her, aber ich werde es versuchen.

    – Chris

    24. Februar 2016 um 9:56

  • Ich weiß mit Sicherheit, dass npm sich geweigert hat, neuen Code von Github zu installieren, selbst wenn ich eine neue Version markiert habe, weil ich vergessen habe, die Version in package.json zu aktualisieren

    – Anders Bornholm

    24. Februar 2016 um 9:59

  • Ich habe versucht, die Version in zu aktualisieren package.json innerhalb mymod wie vorgeschlagen. Es macht keinen Unterschied npm install, was immer noch nichts bewirkt. Es stellt nicht einmal eine Verbindung zum Git-Repository her. Nur ein explizites npm install git+https://etc/mymod zwingt es, die neueste Version abzurufen.

    – Chris

    24. Februar 2016 um 10:19 Uhr

  • Der Punkt ist, dass es in package.json keine Versionsnummer gibt – es handelt sich um eine Snapshot-Abhängigkeit, daher sollte immer der neueste Code verwendet werden.

    – Chris

    24. Februar 2016 um 9:49 Uhr


  • Soweit ich weiß, konzentriert sich npm sehr auf Versionsnummern. Aber ich beziehe mich auf die Aktualisierung der Version in mymod, nicht in Ihrem Hauptprojekt. Können Sie mymod dazu bringen, seine Version beim Commit oder Push automatisch zu aktualisieren?

    – Anders Bornholm

    24. Februar 2016 um 9:52 Uhr

  • Ah, ich verstehe, was du meinst. Interessante Idee. Da bin ich mir zu 99 % sicher npm install stellt nicht einmal eine Verbindung zum Git-Server her, aber ich werde es versuchen.

    – Chris

    24. Februar 2016 um 9:56

  • Ich weiß mit Sicherheit, dass npm sich geweigert hat, neuen Code von Github zu installieren, selbst wenn ich eine neue Version markiert habe, weil ich vergessen habe, die Version in package.json zu aktualisieren

    – Anders Bornholm

    24. Februar 2016 um 9:59

  • Ich habe versucht, die Version in zu aktualisieren package.json innerhalb mymod wie vorgeschlagen. Es macht keinen Unterschied npm install, was immer noch nichts bewirkt. Es stellt nicht einmal eine Verbindung zum Git-Repository her. Nur ein explizites npm install git+https://etc/mymod zwingt es, die neueste Version abzurufen.

    – Chris

    24. Februar 2016 um 10:19 Uhr

1450450cookie-checkSorgen Sie dafür, dass npm das neueste Paket aus dem Git-Repo abruft

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy