npm installieren und bauen von Gabel Gubub Repo

125

Dies ist keine völlig neue Frage, aber ich habe mich schon eine Weile umgesehen und habe Probleme, eine Lösung zu finden.

Ich verwende ein Modul für meine Winkel-App namens Angular-Translate. Ich musste jedoch einige kleine Änderungen am Quellcode vornehmen, damit alles so funktioniert, wie ich es möchte, und jetzt möchte ich diese Änderungen beibehalten npm install. Ein Kollege schlug vor, das Repo des Quellcodes zu teilen und auf mein gespaltenes Repo als Abhängigkeit zu verweisen, was ich auf diese Weise versucht habe, z

npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz

Das erste gibt mir ein Verzeichnis wie dieses ohne Build. Nur ein package.json, .npmignore und einige Markdown-Dateien

-angular-translate
   .npmignore 
   .nvmrc
    CHANGELOG.md 
    package.json
    etc

Das zweite npm installgibt mir das volle Repo, aber ich bekomme wieder keinen Build wie bei Verwendung des Befehls npm install angular-translate. Ich habe einige Diskussionen über das Ausführen des vorveröffentlichten Skripts gesehen, bin mir jedoch nicht sicher, wie dies bei der Installation aller Module geschehen soll. Ich habe auch versucht, den Fork als mein eigenes Modul in der npm-Registrierung zu veröffentlichen, aber ich bekomme wieder keinen Build und bin mir nicht sicher, ob das das Richtige ist ...

Ich entschuldige mich für meine Unwissenheit zu diesem Thema. Ich habe nicht viel Erfahrung mit npm. Würde gerne ein Feedback zu diesem Thema bekommen. Es scheint, dass es ein häufig genug auftretendes Problem sein könnte, wenn Änderungen am Quellcode eines Pakets vorgenommen werden müssen. Vielleicht gibt es eine bessere Lösung? Vielen Dank im Voraus für Ihre Hilfe.

hughesjmh
quelle

Antworten:

139

Versuchen Sie npm install <ghusername>/<repoName>, wo <ghUsername>sich Ihr GitHub-Benutzername (ohne den @) und <repoName>der Name des Repositorys befindet. Das sollte es richtig installieren. Sie möchten höchstwahrscheinlich das Flag --saveoder --save-devmit dem Befehl install verwenden, um die Abhängigkeit in Ihrem zu speichern package.json.

Wenn das nicht richtig funktioniert, überprüfen Sie den Inhalt Ihrer .npmignoreDatei.

Keine Panik, wenn der Installationsbefehl lange dauert. Die Installation aus einem Git-Repository ist langsamer als die Installation aus der npm-Registrierung.


Bearbeiten:

Ihr Problem ist, dass in Ihrem Fall dist/nicht an das Repo gebunden ist (da es in der ist .gitignore). Dort lebt der eigentliche Code. dist/wird aus den Dateien erstellt, src/bevor das Paket in der npm-Registrierung veröffentlicht wird, wird jedoch dist/niemals für das Repo festgeschrieben.

Es ist hässlich, aber in diesem Fall müssen Sie dist/aus dem entfernen .gitignoreund dann ausführen:

npm run build
git add .
git commit
git push

(Stellen Sie sicher, dass Sie npm installzuerst ausgeführt haben)

Sie sollten dann in der Lage sein, von Github zu installieren.

Es gibt vielleicht eine andere Möglichkeit, dies mithilfe eines postinstallSkripts zu tun , aber ich bin mir nicht sicher, ob dies möglich ist. Ich habe es nie ausprobiert.

RyanZim
quelle
2
Ja, das war so ziemlich die Lösung. Musste auch eine npm-Installation durchführen und die GruntFile ein wenig modifizieren, aber das hat es funktioniert. Vielen Dank für Ihre Hilfe :)
Hughesjmh
2
Gibt es wirklich keinen anderen Weg als mit unignore dist? Ich möchte eine PR für das Original-Repo machen, aber mit der Distanz, wird es ihm nicht gefallen?
Ka Mok
7
@KaMok Ich denke, eine andere Option ist, in der package.jsonDatei Ihrer Gabel unter scriptsumbenennen prepublishin prepare. Es scheint, wenn npm installoder npm install github:user_name/fork_name --save(und dasselbe gilt für Garn) ausgeführt wird, wird auch ausgeführt, was im prepareSkript enthalten ist. Dies setzt voraus, dass das prepublishSkript dieses Pakets die Build-Dateien erstellt, was normalerweise der Fall ist.
David Francisco
5
und wenn Sie einen bestimmten Zweig benötigen,npm install <ghusername>/<repoName>#branchName
DrMeers
2
@ RyanZim Du bist falsch. Die Installation von Git funktioniert sehr gut, solange es richtig eingerichtet ist. docs.npmjs.com/cli/install „Wenn das Paket einen installiert enthält prepareSkript, sein dependenciesund devDependenciesinstalliert werden, und die Vorbereitung Skript ausgeführt werden soll, bevor das Paket verpackt und installiert wird .“
Cameron Tacklind
15

Update für Benutzer von npm 5:

Ab npm @ 5 sind prepublishSkripte veraltet.

Verwenden Sie diese Option preparefür Build-Schritte und nur prepublishOnlyzum Hochladen.

Ich habe festgestellt, dass das Hinzufügen eines "prepare": "npm run build"Skripts alle meine Probleme behoben hat.

Simon
quelle
Das hat auch bei mir funktioniert (in einer Gabel, die ich gerade gemacht habe) - danke! Ich frage mich ... warum enthalten nicht alle Pakete standardmäßig nur diese Skriptkonfiguration? Liegt es daran, dass Paketautoren nur den Anwendungsfall der Installation ihres Pakets von npm und nicht den Fall der Installation von einem Git-Repo berücksichtigen? Sie sind es also gewohnt, manuell zu laufen npm run buildund npm run publishhaben keine Probleme oder Schmerzen, es sei denn, sie versuchen eines Tages, das Repo über Git zu installieren?
Tyler Rick
9

Auf npmjs.com veröffentlichter Code befindet sich häufig nicht im Repository des Pakets. Es ist üblich, JavaScript-Quelldateien in Versionen zu "kompilieren", die für den allgemeinen Gebrauch in Bibliotheken bestimmt sind. Das ist es, was normalerweise auf npmjs.com veröffentlicht wird.

Es ist so üblich, dass vor dem Veröffentlichen ( ) npmautomatisch ein "Build" -Schritt ausgeführt wird . Dies wurde ursprünglich genannt . Es scheint, dass Npm es für praktisch hielt, das Skript auch auf einem auszuführen, da dies die Standardmethode zum Initialisieren einer Entwicklungsumgebung war.npm publishprepublishprepublishnpm install

Dies führte zu großer Verwirrung in der Gemeinde. Es gibt sehr lange Probleme mit Github.

Um das alte Verhalten nicht zu ändern, beschlossen sie schließlich, zwei weitere automatische Skripte hinzuzufügen: prepublishOnlyund prepare.

prepublishOnlymacht was du erwartest. Es läuft nicht weiter npm install. Viele Paketbetreuer haben einfach blindlings darauf umgestellt.

Es gab aber auch das Problem, dass die Leute sich nicht auf npmjs.com verlassen wollten, um Versionen von Paketen zu verteilen. Git-Repositories waren die natürliche Wahl. Es ist jedoch üblich, "kompilierte" Dateien nicht an git zu übergeben. Das preparewurde hinzugefügt, um damit umzugehen ...

prepare ist der richtige Weg

Wenn Sie ein Repository mit Quelldateien haben, für deren Verwendung jedoch ein "Build" -Schritt erforderlich ist,
preparewird in allen Fällen genau das getan, was Sie möchten (ab npm 4).

prepare: Führen Sie beide aus, BEVOR das Paket gepackt und veröffentlicht wird, lokal npm installohne Argumente und bei der Installation von Git-Abhängigkeiten.

Sie können sogar Ihre Build-Abhängigkeiten devDependencieseinfügen, die vor der prepareAusführung installiert werden .

Hier ist ein Beispiel eines Pakets von mir, das diese Methode verwendet.


Probleme mit .gitignore

Es gibt ein Problem mit dieser Option, das viele Menschen betrifft. Bei der Vorbereitung einer Abhängigkeit behalten Npm und Yarn nur die Dateien bei, die im filesAbschnitt von aufgeführt sind package.json.

Man könnte sehen, dass filesstandardmäßig alle Dateien enthalten sind und denken, dass sie fertig sind. Was ist leicht zu übersehen , dass .npmignore vor allem die überschreibt filesRichtlinie und , falls .npmignorenicht vorhanden ist , .gitignorewird stattdessen verwendet.

Wenn Sie also Ihre erstellten Dateien .gitignorewie eine vernünftige Person aufgelistet haben und nichts anderes tun, preparewird dies als fehlerhaft erscheinen

Wenn Sie festlegen files, dass nur die erstellten Dateien eingeschlossen oder eine leere hinzugefügt werden .npmignore, sind Sie fertig.

Meine Empfehlung ist, files(oder durch Inversion .npmignore) so einzustellen , dass die einzigen tatsächlich veröffentlichten Dateien diejenigen sind, die von Benutzern des veröffentlichten Pakets benötigt werden. Imho, es ist nicht nötig, nicht kompilierte Quellen in veröffentlichte Pakete aufzunehmen.


Ursprüngliche Antwort: https://stackoverflow.com/a/57503862/4612476

Cameron Tacklind
quelle
1
PREPARE funktionierte für mich anstelle von POSTINSTALL.Ich habe gerade npm run build in prepare ausgeführt.
Milind
6

Es postinstallist definitiv eine gültige Option, die hervorragende Antwort von @ RyanZim zu nutzen .

Führen Sie entweder einen der folgenden Schritte aus:

  1. Aktualisieren Sie die Datei package.json in Ihrem gespaltenen Repo, um Skripten ein Postinstall-Element hinzuzufügen. Führen Sie hier alles aus, was Sie benötigen, um die kompilierte Ausgabe zu erhalten (bevorzugt).
  2. Aktualisieren Sie Ihre package.json und fügen Sie eine Nachinstallation hinzu, die das erforderliche Verzeichnis in node_modules aktualisiert.

Wenn Sie das Repository einer anderen Person gespalten haben, kann es sinnvoll sein, ein Problem anzusprechen, um das Problem zu veranschaulichen, dass die Installation ihres Pakets über GitHub nicht funktioniert, da es nicht die erforderlichen Mittel zum Erstellen des Skripts bietet. Von dort aus können sie entweder eine PR akzeptieren, um dies mit einer Nachinstallation zu beheben, oder sie können sie ablehnen und Sie können # 2 tun.

Mike B.
quelle
Können Sie erklären oder eine Ressource dazu haben, wie man # 2 macht? Welche Befehle muss ich nach der npm-Installation ausführen, wenn der Gitrepo nur src not dist enthält
Daniel
1
@ Daniel Entschuldigung, ich versuche mich an den Kontext zu erinnern, in dem ich dies in der Vergangenheit getan habe. Ich denke, dass ich mit # 2 beabsichtigte, Ihren Hauptpaketen einen Nachinstallationsschritt hinzuzufügen "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build". Wie gesagt, ich bevorzuge den Ansatz, das Repo meinem eigenen Benutzer zu überlassen, die Nachinstallation zum Paket selbst hinzuzufügen und diese in meiner Anwendung zu verwenden.
Mike B
Ich denke, das Hinzufügen zur Vorbereitung sollte bevorzugt werden (@ Simons Antwort), da Sie bei der Installation ab npm keine zusätzlichen Gebäude erstellen müssten, da es bereits ein dist / dir enthalten sollte. Siehe docs.npmjs.com/misc/scripts : "vorbereiten: Führen Sie beide aus, BEVOR das Paket gepackt und veröffentlicht wird, ... und wenn Sie Git-Abhängigkeiten installieren"
Tyler Rick
postinstallist einen Schritt zu kurz von der richtigen Lösung. Einfach benutzen prepare. Es ist 2020.
Cameron Tacklind
2

Verwenden Sie einfach den Befehl npm install git+https://[email protected]/myRepo/angular-translate.git. Vielen Dank.

Bimal Jha
quelle