npm installer et construire un dépôt github fourchu

126

Ce n'est pas une question totalement nouvelle, mais je cherche depuis un bon moment maintenant et j'ai du mal à trouver une solution.

J'utilise un module pour mon application angulaire appelé angular-translate. Cependant, j'ai dû apporter quelques petites modifications au code source pour que tout fonctionne comme je le souhaite, et maintenant je veux conserver ces modifications npm install. Un collègue m'a suggéré de bifurquer le dépôt du code source et de pointer vers mon dépôt fourchu en tant que dépendance, ce que j'ai essayé de cette manière, par exemple

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

Le premier me donne un répertoire comme celui-ci sans build. Juste un package.json, .npmignore et quelques fichiers markdown

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

Le second npm installme donne le repo complet, mais encore une fois, je n'obtiens pas de build comme lorsque j'utilise la commande npm install angular-translate. J'ai vu quelques discussions sur l'exécution du script de pré-publication, mais je ne sais pas comment faire cela lors de l'installation de tous les modules. J'ai également essayé de publier le fork en tant que mon propre module dans le registre npm, mais encore une fois, je n'ai pas de build, et je ne suis pas sûr que ce soit la bonne chose à faire ...

Je m'excuse de mon ignorance sur le sujet. Je n'ai pas une grande expérience avec npm. J'adorerais avoir des commentaires sur ce problème. Il semble que cela puisse être un problème assez courant lorsque des modifications doivent être apportées au code source d'un paquet? Peut-être qu'il y a une meilleure solution? Merci d'avance pour votre aide.

Hughesjmh
la source

Réponses:

141

Essayez npm install <ghusername>/<repoName>, où <ghUsername>est votre nom d'utilisateur GitHub (sans le @) et <repoName>est le nom du référentiel. Cela devrait l'installer correctement. Vous souhaiterez probablement utiliser l' indicateur --saveou --save-devavec la commande d'installation pour enregistrer la dépendance dans votre fichier package.json.

Si cela ne fonctionne pas correctement, vérifiez le contenu de votre .npmignorefichier.

Ne paniquez pas si la commande d'installation prend beaucoup de temps; l'installation à partir d'un référentiel git est plus lente que l'installation à partir du registre npm.


Éditer:

Votre problème est que dans votre cas, dist/n'est pas engagé dans le repo (puisqu'il est dans le .gitignore). C'est là que réside le code réel. dist/est construit à partir des fichiers src/avant la publication du package dans le registre npm, mais dist/n'est jamais validé dans le dépôt.

C'est moche, mais dans ce cas, vous devrez supprimer dist/du .gitignorepuis exécuter:

npm run build
git add .
git commit
git push

(Assurez-vous que vous avez exécuté en npm installpremier)

Vous devriez alors pouvoir installer à partir de github.

Il peut y avoir une autre façon de faire cela en utilisant un postinstallscript, mais je ne suis pas sûr que ce soit possible; Je n'ai jamais essayé.

RyanZim
la source
2
Oui, c'était à peu près la solution. J'ai également dû faire une installation de npm et modifier un peu le GruntFile, mais cela l'a fait fonctionner. Merci pour votre aide :)
hughesjmh
2
N'y a-t-il vraiment pas d'autre moyen de faire avec autre que dist unignore? Je veux faire un PR pour le repo original, mais avec le dist, ne va-t-il pas l'aimer?
Ka Mok du
7
@KaMok Je pense qu'une autre option est de, dans le package.jsonfichier de votre fourchette, sous scripts, renommer prepublishen prepare. Il semble que lorsque npm installou npm install github:user_name/fork_name --save(et même pour le fil) est exécuté, il exécute également ce qui est dans le preparescript. Cela suppose que le prepublishscript de ce package crée les fichiers de construction, ce qui est généralement le cas.
davidfrancisco
5
et si vous avez besoin d'une branche spécifique,npm install <ghusername>/<repoName>#branchName
DrMeers
2
@RyanZim Vous avez tort. L'installation depuis git fonctionne très bien tant qu'elle est correctement configurée. docs.npmjs.com/cli/install "Si le package en cours d'installation contient un preparescript, dependenciesil devDependenciessera installé et le script de préparation sera exécuté, avant que le package ne soit empaqueté et installé."
Cameron Tacklind
15

Mise à jour pour ceux qui utilisent npm 5:

Depuis npm @ 5, les prepublishscripts sont obsolètes.

À utiliser preparepour les étapes de construction et prepublishOnlypour le téléchargement uniquement.

J'ai trouvé que l'ajout d'un "prepare": "npm run build"à des scripts a résolu tous mes problèmes.

Simon
la source
Cela a fonctionné pour moi aussi (dans une fourchette que je viens de fabriquer) - merci! Je me demande ... pourquoi tous les packages n'incluent-ils pas simplement cette configuration de script par défaut? Est-ce parce que les auteurs de packages considèrent uniquement le cas d'utilisation de l'installation de leur package à partir de npm et non le cas de son installation à partir d'un dépôt git? Donc , ils sont juste utilisés pour l' exécution manuelle npm run buildet npm run publishet ne rencontrez un problème ou une douleur à moins qu'ils essaient un jour d'installer le repo via git?
Tyler Rick
9

Le code publié sur npmjs.com n'est souvent pas ce qui se trouve dans le référentiel du package. Il est courant de «compiler» les fichiers source JavaScript dans des versions destinées à une consommation générale dans les bibliothèques. C'est ce qui est généralement publié sur npmjs.com.

Il est si courant que c'est une fonctionnalité de npmlancer automatiquement une étape de "construction" avant de publier ( npm publish). Cela s'appelait à l'origine prepublish. Il semble que Npm a pensé qu'il serait pratique d'exécuter également le prepublishscript sur un npm installcar c'était la manière standard d'initialiser un environnement de développement.

Cela a conduit à une grande confusion dans la communauté. Il y a de très longs problèmes sur github à ce sujet.

En fin de compte, dans un effort pour ne pas changer l'ancien comportement, ils ont décidé d'ajouter deux autres scripts automatiques: prepublishOnlyet prepare.

prepublishOnlyfait ce que vous attendez. Il ne fonctionne pas npm install. De nombreux responsables de paquets sont simplement passés à cela.

Mais il y avait aussi ce problème que les gens voulaient ne pas dépendre de npmjs.com pour distribuer des versions de paquets. Les dépôts Git étaient le choix naturel. Cependant, il est courant de ne pas valider les fichiers "compilés" dans git. C'est ce qui a prepareété ajouté pour gérer ...

prepare est la bonne manière

Si vous avez un référentiel avec des fichiers sources mais qu'une étape de "build" est nécessaire pour l'utiliser,
preparefait exactement ce que vous voulez dans tous les cas (à partir de npm 4).

prepare: Exécutez les deux AVANT que le paquet ne soit compressé et publié, en local npm installsans aucun argument, et lors de l'installation des dépendances git.

Vous pouvez même insérer vos dépendances de construction devDependencieset elles seront installées avant d' prepareêtre exécutées.

Voici un exemple de mon package qui utilise cette méthode.


Problèmes avec .gitignore

Il y a un problème avec cette option qui attire de nombreuses personnes. Lors de la préparation d'une dépendance, Npm et Yarn conserveront uniquement les fichiers répertoriés dans la filessection de package.json.

On peut voir que filestous les fichiers sont inclus par défaut et penser qu'ils sont terminés. Ce qui est facilement manqué, c'est que la .npmignore plupart du temps remplace la filesdirective et , s'il .npmignoren'existe pas, .gitignoreest utilisé à la place.

Donc, si vos fichiers construits sont répertoriés .gitignorecomme une personne sensée et que vous ne faites rien d'autre, preparecela semblera cassé

Si vous résolvez filesd'inclure uniquement les fichiers .npmignorecréés ou d'ajouter un fichier vide , vous êtes prêt.

Ma recommandation est de définir files(ou, par inversion, .npmignore) de telle sorte que les seuls fichiers réellement publiés soient ceux nécessaires aux utilisateurs du package publié. Imho, il n'est pas nécessaire d'inclure des sources non compilées dans les packages publiés.


Réponse originale: https://stackoverflow.com/a/57503862/4612476

Cameron Tacklind
la source
1
PREPARE a fonctionné pour moi au lieu de POSTINSTALL.i vient de lancer npm run build dans prepare.
Milind
6

Se greffer sur l'excellente réponse de @ RyanZim, postinstallest certainement une option valable pour cela.

Effectuez l'une des opérations suivantes:

  1. Mettez à jour le package.json dans votre dépôt forké pour ajouter un élément de post-installation aux scripts. Ici, exécutez tout ce dont vous avez besoin pour obtenir la sortie compilée (préféré).
  2. Mettez à jour votre package.json et ajoutez une post-installation qui met à jour le répertoire nécessaire dans node_modules.

Si vous avez forké un autre référentiel de personnes, il peut être intéressant de soulever un problème pour illustrer le problème selon lequel l'installation de leur package via GitHub ne fonctionne pas car elle ne fournit pas les moyens nécessaires pour créer le script. À partir de là, ils peuvent soit accepter un PR pour résoudre ce problème avec une post-installation, soit le rejeter et vous pouvez faire le # 2.

Mike B
la source
Pouvez-vous expliquer ou avoir des ressources sur la façon de faire # 2? Quelles commandes dois-je exécuter après l'installation de npm lorsque le gitrepo ne contient que src et non dist
Daniel
1
@Daniel Excuses, j'essaie de me souvenir du contexte dans lequel j'ai fait ça dans le passé. Je pense que par # 2, je voulais ajouter une étape de post-installation à votre principal packages.json qui exécuterait les étapes de la réponse supérieure, donc quelque chose du genre "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"pour s'assurer que le package qui vous cause des problèmes est construit avant que votre application ne s'exécute. Comme dit, cependant, je préfère l'approche consistant à forger le dépôt à mon propre utilisateur, en ajoutant la post-installation au package lui-même et en l'utilisant dans mon application.
Mike B
Je pense que l'ajout pour préparer devrait être préféré (réponse de @ Simon), car si vous installez à partir de npm, vous n'auriez pas besoin de faire de construction supplémentaire car il devrait déjà inclure un dist / dir. Voir docs.npmjs.com/misc/scripts : "prepare: Exécutez les deux AVANT que le paquet ne soit emballé et publié, ... et lors de l'installation des dépendances git"
Tyler Rick
postinstallest une étape avant la bonne solution. Utilisez simplement prepare. Nous
sommes
2

Utilisez simplement la commande npm install git+https://[email protected]/myRepo/angular-translate.git. Merci.

Bimal Jha
la source