npm von Git in einer bestimmten Version installieren


181

Angenommen, ich habe ein Modul für Node.js geschrieben, das ich privat halten möchte. Ich weiß, dass ich die Zeile hinzufügen kann (sollte):

"private": "true"

zu der package.jsonDatei, und ich weiß auch, dass ich npm installdieses Modul über einen Dateisystempfad oder einen Link zu einem Git-Repository, einschließlich GitHub, verwenden kann.

Ich weiß auch, dass ich einen solchen Dateisystempfad oder einen Link zu einem Git-Repo einfügen kann package.json, damit der dependenciesTeil ungefähr so aussieht:

"dependencies": {
  "myprivatemodule": "git@github.com:..."
}

Was ich jetzt möchte, ist nicht auf die neueste Version zu verlinken, sondern auf eine bestimmte. Die einzige mir bekannte Möglichkeit besteht darin, mithilfe seiner ID eine Verknüpfung zu einem bestimmten Commit herzustellen. Dies ist jedoch weitaus weniger lesbar und schlechter zu warten als die Verwendung einer Versionsnummer wie 0.3.1.

Meine Frage lautet also: Ist es überhaupt möglich, eine solche Versionsnummer anzugeben und npm das Git-Repository nach dem neuesten Commit durchsuchen zu lassen, das diese Version enthält?

Wenn nicht, wie lösen Sie dieses Problem in Ihren Projekten? Leben Sie mit Commit-IDs oder gibt es eine bessere Lösung dafür?

Antworten:


193

Eine Abhängigkeit muss von der registryzu installierenden Dateiversion verfügbar sein, indem nur ein Deskriptor angegeben wird .

Sie können sicherlich Ihre eigene Registrierung erstellen und verwenden, anstatt registry.npmjs.orgwenn Ihre Projekte nicht öffentlich geteilt werden sollen.

Wenn es sich jedoch nicht in einer Registrierung befindet, muss es über eine URL oder eine Git-URL referenziert werden . Um eine Version mit einer Git-URL anzugeben <commit-ish>, fügen Sie am Ende ein geeignetes Element wie ein Tag als URL-Fragment hinzu .

Beispiel für ein Tag mit dem Namen 0.3.1:

"dependencies": {
  "myprivatemodule": "git@github.com:...#0.3.1"
}

Hinweis : Das obige Snippet zeigt die Basis-URL genauso an, wie sie in der Frage veröffentlicht wurde.

Der abgeschnittene Teil ( ...) sollte ausgefüllt werden:

"myprivatemodule": "git@github.com:{owner}/{project}.git#0.3.1"

Ein anderes Adressformat wird benötigt, wenn kein SSH-Zugriff verfügbar ist:

"myprivatemodule": "git://github.com/{owner}/{project}.git#0.3.1"

Abhängig von Ihrem Betriebssystem können Sie möglicherweise auch linkauf die Abhängigkeit in einem anderen Ordner zugreifen, in dem Sie sie von Github geklont haben.


1
Einige der Links in diesem Beitrag scheinen veraltet zu sein, da sie stattdessen zu 404 Seiten führen. Schade, denn einige davon sind Informationen, nach denen ich schon lange gesucht habe.
MvG

5
Ich habe eine bestimmte Version mit markiert git tag -a "1.0.0"und gepusht git push --tags, dann habe ich die #v1.0.0am Ende der git+sshAbhängigkeit hinzugefügt . Aber npm updatees passiert nichts.
Loretoparisi

3
@loretoparisi Entschuldigung. Ich wollte nicht vorschlagen, dass das Hinzufügen vnotwendig ist. Nach dem #sollte das Fragment mit dem vollständigen Namen des Tags (oder einem anderen Commitsh ) übereinstimmen - in Ihrem Fall #1.0.0.
Jonathan Lonowski

Ab Juli 2016 ist das Hosting der eigenen Registrierung komplizierter geworden, da sie von Couchdb zu Microservices wechseln
Yan Foto

3
Sie können jetzt package.json ausführen npm i {owner}/{project}#{tag}oder hinzufügen "{library}": "github:{owner}/{project}#{tag}", anstatt git@github.comodergit://github.com
Mike W

237

Die akzeptierte Antwort hat bei mir nicht funktioniert. Folgendes mache ich, um ein Paket aus Github zu ziehen:

npm install --save "git://github.com/username/package.git#commit"

Oder fügen Sie es manuell auf package.json hinzu:

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}

41
Wenn Sie http / https verwenden, stellen Sie sicher, dass Sie das Präfix "git +" angeben:"package": "git+https://github.com/username/package.git#commit"
Ates Goral

4
Dies funktionierte bis zu "npm install", aber als ich versuchte, meine Anwendung auszuführen, konnte die Anforderung ('mymodule') das Paket nicht finden. Obwohl sich das Paket im gleichnamigen Verzeichnis node_modules befindet.
Derrick

Oh, das betreffende Modul enthielt nicht den Build mit dem von mir gewünschten Commit. Wenn Sie also das gleiche Problem haben, müssen Sie es möglicherweise manuell erstellen.
Derrick

1
Sie können auch verwenden, #tagdie in der Regel auf eine Versionsnummer zeigt
Deltree

1
@surjikal Sie müssen eine Version markieren, bevor Sie Versionsnummern mit git verwenden können. zB git tag -a v1.0.1 && git push --tag && git pushwie @Jonathan Lonowski auch in einem Kommentar sagte.
dotnetCarpenter

80

Wenn Sie mit Version ein Tag oder eine Veröffentlichung meinen, bietet github Download-Links für diese. Zum Beispiel, wenn ich installieren mag holen Version 0.3.2 (es ist nicht auf npm ist), dann füge ich meine package.jsonunter dependencies:

"fetch": "https://github.com/github/fetch/archive/v0.3.2.tar.gz",

Der einzige Nachteil im Vergleich zum Commit-Hash-Ansatz besteht darin, dass ein Hash garantiert keinen geänderten Code darstellt, während ein Tag ersetzt werden könnte. Zum Glück passiert das selten.

Aktualisieren:

Heutzutage verwende ich die kompakte Notation für eine von GitHub bereitgestellte Abhängigkeit:

"dependencies": {
  "package": "github:username/package#commit"
}

Wo Commit etwas Commit sein kann, wie ein Tag. Im Fall von GitHub können Sie sogar die Initiale löschen, github:da dies die Standardeinstellung ist.


Der Archivierungsmodus funktioniert auch für Commits. zB `Garn hinzufügen github.com
github

Sauberste Lösung.
Charley Bodkin

8

Mein Beispielkommentar zu @qubyte oben wurde gehackt, also hier ist etwas, das leichter zu lesen ist ...

Das Verfahren @surjikal beschrieben über Werke für Zweig Commits, aber es hat nicht funktioniert für einen Baum befehle ich versuchte , umfassen.


Der Archivierungsmodus funktioniert auch für Commits. Zum Beispiel holen Sie @ a2fbf83

npm :

npm install  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

Garn :

yarn add  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

Format :

 https://github.com/<owner>/<repo>/archive/<commit-id>.tar.gz


Hier ist das Tree Commit, für das der /archive/Modus erforderlich ist:

yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz

für das zugehörige vuex commit


8

Dieser Befehl installiert das npm-Paket username/packagevon einem bestimmten Git-Commit:

npm install https://github.com/username/package#3d0a21cc

Hier 3d0a21ccsind die ersten 8 Zeichen des Commit-Hash.


3

Ich beschreibe hier ein Problem, mit dem ich beim Ausführen konfrontiert war npm install- das Paket wird nicht angezeigt node_modules.

Das Problem war, dass sich der nameWert package.jsondes installierten Pakets vom Namen des importierten Pakets unterschied (Eingabe package.jsonmeines Projekts).

Wenn Ihr installierter Projektname also some-package(Name Wert in seiner package.json) ist, package.jsonschreiben Sie in Ihr Projekt : "some-package": "owner/some-repo#tag".


Ich wünschte, ich hätte Ihre Antwort früher gefunden 😓 - Ich habe sie gerade gelöst, mit dem gleichen Problem, das mich eine Weile kämpfen lässt. und diese nameAnforderung wird im Netz nicht oft erwähnt. (zumindest nicht, dass ich daran beteiligt sein könnte.)
Kamafeather

"Fügen Sie Ihre Paketabhängigkeiten zu package.json hinzu und geben Sie den vollständigen Paketnamen an." - Nicht wirklich betont: help.github.com/de/articles/…
Kamafeather

Ich fand heraus, dass dies npm install --save git+https://<remote-github-repo-url>ein ziemlich sicherer Weg ist, um dieses Problem in Zukunft nicht mehr zu lösen.
Kamafeather

2

Ich musste zwei Versionen von tfjs-core ausführen und stellte fest, dass beide nach der Installation erstellt werden mussten.

package.json:

"dependencies": {
  "tfjs-core-0.14.3": "git://github.com/tensorflow/tfjs-core#bb0a830b3bda1461327f083ceb3f889117209db2",
  "tfjs-core-1.1.0": "git://github.com/tensorflow/tfjs-core#220660ed8b9a252f9d0847a4f4e3c76ba5188669"
}

Dann:

cd node_modules/tfjs-core-0.14.3 && yarn install && yarn build-npm && cd ../../
cd node_modules/tfjs-core-1.1.0  && yarn install && yarn build-npm && cd ../../

Und schließlich, um die Bibliotheken zu nutzen:

import * as tf0143 from '../node_modules/tfjs-core-0.14.3/dist/tf-core.min.js';
import * as tf110 from '../node_modules/tfjs-core-1.1.0/dist/tf-core.min.js';

Das hat super geklappt, ist aber mit Sicherheit #hoodrat


1
Vielen Dank, ich habe versucht, es auf jede andere erdenkliche Weise zu importieren. Ich musste Ihr Snippet sehen, um zu erkennen, dass ich direkt aus der Datei importieren musste.
Victor Ivens

1

Wenn Sie dies mit mehr als einem Modul tun und mehr Kontrolle über Versionen haben möchten, sollten Sie eine eigene private npm-Registrierung in Betracht ziehen.

Auf diese Weise können Sie Ihre Module in Ihrer privaten npm-Registrierung veröffentlichen und die Einträge für package.json genauso verwenden wie für öffentliche Module.

https://docs.npmjs.com/files/package.json#dependencies


Alle Links sind 404
Cyrille Pontvieux
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.