npm installer depuis Git dans une version spécifique

181

Supposons que j'ai écrit un module pour Node.js que je voudrais garder privé. Je sais que je peux (dois) ajouter la ligne:

"private": "true"

au package.jsonfichier, et je sais aussi que je peux npm installutiliser ce module en utilisant un chemin d'accès au système de fichiers ou un lien vers un référentiel git, y compris GitHub.

Je sais aussi que je peux mettre un tel chemin de système de fichiers ou un lien vers un dépôt git package.json, afin que la dependenciespartie ressemble un peu à ceci:

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

Ce que je veux maintenant, ce n'est pas un lien vers la dernière version, mais vers une version spécifique. La seule possibilité que je connaisse est de créer un lien vers un commit spécifique en utilisant son ID. Mais c'est beaucoup moins lisible et pire maintenable que d'utiliser un numéro de version tel que 0.3.1.

Ma question est donc la suivante: est-il possible de spécifier un tel numéro de version de toute façon et de demander à npm de rechercher dans le référentiel git le dernier commit qui inclut cette version?

Sinon, comment résolvez-vous ce problème dans vos projets? Vivez-vous avec des ID de validation ou existe-t-il une meilleure solution à cela?

Golo Roden
la source

Réponses:

193

Une dépendance doit être disponible à partir de registrypour être installée simplement en spécifiant un versiondescripteur .

Vous pouvez certainement créer et utiliser votre propre registre au lieu de registry.npmjs.orgne pas partager publiquement vos projets.

Mais si ce n'est pas dans un registre, il devra être référencé par URL ou URL Git . Pour spécifier une version avec une URL Git, incluez un élément approprié <commit-ish>, tel qu'une balise, à la fin en tant que fragment d'URL .

Exemple, pour une balise nommée 0.3.1 :

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

Remarque : L'extrait de code ci-dessus montre l'URL de base de la même manière qu'elle a été publiée dans la question.

La partie coupée (... ) doit être remplie:

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

Et, un format d'adresse différent sera nécessaire lorsque l'accès SSH n'est pas disponible:

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

En fonction de votre système d'exploitation, vous pouvez également accéder linkà la dépendance dans un autre dossier où vous l'avez clonée à partir de Github.

Jonathan Lonowski
la source
1
Il semble que certains des liens de cet article soient obsolètes, car ils mènent à 404 pages à la place. Ce qui est dommage, car certaines de ces informations sont des informations que je recherchais depuis un bon moment.
MvG
5
J'ai marqué une version spécifique avec git tag -a "1.0.0"et poussé git push --tags, puis j'ai ajouté le #v1.0.0à la fin de la git+sshdépendance. Mais npm updaterien ne se passe.
loretoparisi
3
@loretoparisi Désolé. Je ne voulais pas suggérer que l'ajout vétait nécessaire. Après le #, le fragment doit correspondre au nom complet de l'étiquette (ou autre commitsh ) - dans votre cas, #1.0.0.
Jonathan Lonowski
En juillet 2016, l'hébergement de son propre registre est devenu plus compliqué à mesure qu'ils passent de couchdb aux microservices
Yan Foto
3
Vous pouvez maintenant faire npm i {owner}/{project}#{tag}ou ajouter "{library}": "github:{owner}/{project}#{tag}"à package.json au lieu d'utiliser [email protected]ougit://github.com
Mike W
238

La réponse acceptée n'a pas fonctionné pour moi. Voici ce que je fais pour extraire un paquet de github:

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

Ou en l'ajoutant manuellement sur package.json:

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}
surjikal
la source
41
Si vous utilisez http / https, assurez-vous d'inclure le préfixe "git +":"package": "git+https://github.com/username/package.git#commit"
Ates Goral
4
Cela a fonctionné jusqu'à "npm install" mais quand j'ai essayé d'exécuter mon application, require ('mymodule') n'a pas réussi à trouver son package. Même si le package est dans le répertoire node_modules avec le même nom.
Derrick
Oh, le module en question n'incluait pas la compilation avec le commit spécifique que je voulais donc si vous avez le même problème, vous devrez peut-être le construire manuellement.
Derrick
1
vous pouvez également utiliser #tagce qui pointe généralement vers un numéro de version
deltree
1
@surjikal vous devez baliser une version avant de pouvoir utiliser les numéros de version avec git. par exemple, git tag -a v1.0.1 && git push --tag && git pushcomme @Jonathan Lonowski l'a également dit dans un commentaire.
dotnetCarpenter
80

Si par version vous entendez une balise ou une version, alors github fournit des liens de téléchargement pour ceux-ci. Par exemple, si je veux installer la version 0.3.2 de fetch (elle n'est pas disponible sur npm), alors j'ajoute à mon package.jsonsous dependencies:

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

Le seul inconvénient par rapport à l'approche de hachage de validation est qu'un hachage est garanti de ne pas représenter le code modifié, alors qu'une balise pourrait être remplacée. Heureusement, cela arrive rarement.

Mettre à jour:

Ces jours-ci, l'approche que j'utilise est la notation compacte pour une dépendance servie GitHub:

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

Où commit peut être n'importe quoi, comme une balise. Dans le cas de GitHub, vous pouvez même supprimer l'initiale github:car c'est la valeur par défaut.

qubyte
la source
Le mode archive fonctionne également pour les commits; par exemple, `yarn add github.com/github/fetch/archive/... `
bvj
La solution la plus propre.
Charley Bodkin le
8

Mon exemple de commentaire à @qubyte ci-dessus a été haché, alors voici quelque chose de plus facile à lire ...

La méthode @surjikal décrite ci - dessus fonctionne pour les commits de branche, mais cela n'a pas fonctionné pour un commit d' arbre que j'essayais d'inclure.


Le mode archive fonctionne également pour les commits. Par exemple, récupérez @ a2fbf83

npm :

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

fil :

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

format :

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


Voici le commit d' arborescence qui nécessitait le /archive/mode:

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

pour le commit vuex associé

bvj
la source
8

Cette commande installe le package npm à username/packagepartir d'un commit git spécifique:

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

Voici les 3d0a21cc8 premiers caractères du hachage de validation.

Prisacari Dmitrii
la source
3

Je décris ici un problème auquel j'ai été confronté lors de l'exécution npm install- le package n'apparaît pas dans node_modules.

Le problème était que la namevaleur package.jsondu package installé était différente du nom du package importé (entrée package.jsonde mon projet).

Donc , si votre nom de projet est installé some-package(valeur de nom dans son package.json) puis dans package.jsonvotre écriture de projet: "some-package": "owner/some-repo#tag".

Andrew
la source
J'aurais aimé trouver votre réponse plus tôt 😓 - Je viens de résoudre, avec le même problème qui me fait lutter pendant un certain temps; et çaname exigence n'est pas souvent mentionnée sur le net .. (pas que je pourrais m'engager là-dedans, du moins).
Kamafeather
"Ajoutez vos dépendances de package à votre package.json en spécifiant le nom complet du package de portée." - Ne pas vraiment insister dessus: help.github.com/en/articles
...
J'ai découvert que npm install --save git+https://<remote-github-repo-url>c'était un moyen assez sûr de ne plus toucher à ce problème à l'avenir.
Kamafeather le
2

J'avais besoin d'exécuter deux versions de tfjs-core et trouvé que les deux devaient être construits après avoir été installés.

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

Ensuite:

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 ../../

Et enfin, pour utiliser les bibliothèques:

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';

Cela a très bien fonctionné mais est très certainement #hoodrat

duhaime
la source
1
Merci, j'ai essayé de l'importer de toutes les autres manières imaginables. J'ai dû voir votre extrait de code pour réaliser que je devais importer directement à partir du fichier.
Victor Ivens
1

Si vous faites cela avec plus d'un module et que vous souhaitez avoir plus de contrôle sur les versions, vous devriez envisager d'avoir votre propre registre npm privé.

De cette façon, vous pouvez npm publier vos modules dans votre registre npm privé et utiliser les entrées package.json de la même manière que vous le feriez pour les modules publics.

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

Igor Soarez
la source
Tous les liens sont 404
Cyrille Pontvieux