web-dev-qa-db-de.com

npm von Git in einer bestimmten Version installieren

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 (soll):

"private": "true"

auf die package.json-Datei, und ich weiß auch, dass ich dieses Modul mithilfe eines Dateisystempfads oder eines Links zu einem Git-Repository, einschließlich GitHub, npm install kann.

Ich weiß auch, dass ich einen solchen Dateisystempfad oder einen Link zu einem Git-Repo in package.json setzen kann, sodass der dependencies-Teil in etwa wie folgt aussehen kann:

"dependencies": {
  "myprivatemodule": "[email protected]:..."
}

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

Meine Frage ist also: Ist es möglich, eine solche Versionsnummer trotzdem 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? Lebst du mit Commit-IDs oder gibt es dafür eine bessere Lösung?

136
Golo Roden

Ein Abhängigkeit muss von registry verfügbar sein, um nur von Angabe eines version-Deskriptors installiert zu werden.

Sie können sicherlich eigene Registry erstellen und verwenden anstelle von registry.npmjs.org , wenn Ihre Projekte nicht öffentlich freigegeben werden sollen.

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

Beispiel für ein Tag mit dem Namen 0.3.1:

"dependencies": {
  "myprivatemodule": "[email protected]:...#0.3.1"
}

Note: Das obige Snippet zeigt die Basis-URL genauso an, wie sie in der Frage gepostet wurde.

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

"myprivatemodule": "[email protected]:{owner}/{project}.git#0.3.1"

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

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

Abhängig von Ihrem Betriebssystem können Sie möglicherweise auch link für die Abhängigkeit in einem anderen Ordner verwenden, in dem Sie es von Github geklont haben.

146

Die akzeptierte Antwort hat bei mir nicht funktioniert. Ich mache ein Paket von github:

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"
}
189
surjikal

Wenn Sie unter Version einen Tag oder ein Release meinen, bietet github Download-Links für diese an. Wenn ich beispielsweise fetch Version 0.3.2 installieren möchte (es ist nicht für npm verfügbar), füge ich meinem package.json unter dependencies hinzu:

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

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

Update:

Heutzutage ist der Ansatz, den ich verwende, die kompakte Notation für eine von GitHub bediente Abhängigkeit:

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

Wo Commit alles sein kann, wie ein Tag. Im Falle von GitHub können Sie sogar den ursprünglichen github: löschen, da er standardmäßig verwendet wird.

61
qubyte

Mein Beispielkommentar zu @qubyte oben wurde abgehackt. Hier ist etwas, das einfacher zu lesen ist ...

Die Methode @surjikal beschrieb oben funktioniert für Branch-Commits, jedoch nicht für ein tree -Objekt, das ich versucht habe, einschließen.


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

npm:

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

garne:

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

Format:

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


Hier ist der tree - Commit, der den /archive/-Modus erfordert:

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

für das verwandte vuex commit

8
bvj

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

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

Hier ist 3d0a21cc die ersten 8 Zeichen des Commit-Hashes.

5

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

Auf diese Weise können Sie npm Ihre Module in Ihrer privaten npm-Registry veröffentlichen und package.json-Einträge genauso verwenden, wie Sie es für öffentliche Module tun würden.

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

1
Igor Soarez

Ich beschreibe hier ein Problem, auf das ich bei der Ausführung von npm install gestoßen bin - das Paket erscheint nicht in node_modules.

Das Problem war, dass der name-Wert in package.json des installierten Pakets sich von dem Namen des importierten Pakets unterscheidet (geben Sie package.json meines Projekts ein). 

Wenn der Name Ihres installierten Projekts some-package (Namewert in package.json) lautet, schreiben Sie: __.in package.json Ihres Projekts: "some-package": "owner/some-repo#tag".

0
andrew