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?
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.
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"
}
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.
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
/archive/
-Modus erfordert:yarn add https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz
für das verwandte vuex commit
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.
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.
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"
.