Comment installer un package npm directement depuis GitHub?

870

Essayer d'installer des modules à partir de github entraîne:

Erreur ENOENT sur package.json.

Reproduit facilement en utilisant express:

npm install https://github.com/visionmedia/express jette une erreur.

npm install express travaux.

Pourquoi ne puis-je pas installer à partir de github?

Voici la sortie de la console:

npm http GET https://github.com/visionmedia/express.git
npm http 200 https://github.com/visionmedia/express.git
npm ERR! not a package /home/guym/tmp/npm-32312/1373176518024-0.6586997057311237/tmp.tgz
npm ERR! Error: ENOENT, open '/home/guym/tmp/npm-32312/1373176518024-0.6586997057311237/package/package.json'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <[email protected]>

npm ERR! System Linux 3.8.0-23-generic
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "https://github.com/visionmedia/express.git"
npm ERR! cwd /home/guym/dev_env/projects_GIT/proj/somename
npm ERR! node -v v0.10.10
npm ERR! npm -v 1.2.25
npm ERR! path /home/guym/tmp/npm-32312/1373176518024-0.6586997057311237/package/package.json
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/guym/dev_env/projects_GIT/proj/somename/npm-debug.log
npm ERR! not ok code 0
guy mograbi
la source
1
Quelqu'un peut-il donner le format package.json devDependencies?
Adam
1
@Adam, vous pouvez ajouter "express": "github:visionmedia/express"à la "dependencies"section de package.json file, puis exécuter: npm install(comme mentionné ci-dessous)
Danny
@danny, ça ne marche pas pour moi. je me demande s'il y avait un dossier dist dans ce repo express pour l'activer.
ml242

Réponses:

1159

Parce que https://github.com/visionmedia/expressc'est l'URL d'une page Web et non un module npm. Utilisez cette saveur:

git+https://[email protected]/visionmedia/express.git

ou cette saveur si vous avez besoin de SSH:

git+ssh://[email protected]/visionmedia/express.git
Peter Lyons
la source
86
Vous pouvez également utiliser git+https://github.com/visionmedia/express.gitpour utiliser https plutôt que ssh.
Steve Willcock
43
Notez que référentiel que vous souhaitez installer doit être un module NPM , il doit contenir un package.jsonfichier ou bien vous obtiendrez cette erreur: Error: ENOENT, open 'tmp.tgz-unpack/package.json'.
GabLeRoux
20
et si je veux une branche spécifique
kilianc
3
La seule solution à laquelle je pense pour l'instant est de spécifier un commit avec ... / express.git # commit
Gaston Sanchez
39
Faut dire que vous pourriez avoir besoin pour échapper à l' #utiliser une branche spécifique de la coquille, à savoir:npm install git+https://github.com/user/repo.git\#branch
mor
656

Vous pouvez également faire npm install visionmedia/expresspour installer à partir de Github

ou

npm install visionmedia/express#branch

Il existe également un support pour l'installation directement à partir d'un Gist, Bitbucket, Gitlab et d'un certain nombre d'autres formats spécialisés. Regardez la npm install documentation pour tous.

user2487135
la source
19
Quoi, sans spécifier d'URL? Comment npm sait-il quel service d'hébergement de saveurs vous utilisez?
Jake Rayson,
22
@Jake Rayson: c'est possible depuis la version 1.1.65 et ne fonctionne github.comque pour .
ezze
5
Cela ne fonctionnait pas pour moi sur Windows - il a juste essayé d'installer à partir d'un sous-dossier de mon répertoire actuel.
Jarrod Mosen
7
Notez que cela ne fonctionne pas sur les installations globales (ie npm i repo / pkg -g) à partir de npm 1.4.28
user3751385
1
@ user3751385 Les installations globales semblent fonctionner dans npm 3.3.8.
XåpplI'-I0llwlg'I -
170

Si git n'est pas installé, nous pouvons essayer

npm install --save https://github.com/Amitesh/gulp-rev-all/tarball/master
Amitesh
la source
10
Très bonne réponse! Cela a fonctionné pour moi tandis que d'autres commandes (d'autres réponses) étaient bloquées sur une logique de récupération de git.
Daniel Kmak
2
Vous pouvez également utiliser des noms de balise à la place de master. Probablement plus sûr de le faire de cette façon.
mpen
4
Bien quand vous travaillez avec des succursales, vous devez modifier votre réponse pour inclure une réponse au format général, je n'ai pas remarqué la /tarball/première
Lu Roman
2
C'est la seule réponse qui a fonctionné pour moi lors de l'installation d'une dépendance à partir d'un conteneur Docker.
Fela Maslen
1
C'est également parfait pour ne pas avoir besoin de télécharger l'intégralité du référentiel. Merci!
som
59

Mise à jour de septembre 2016

L'installation à partir d'URL github https vanilla fonctionne maintenant:

npm install https://github.com/fergiemcdowall/search-index.git

EDIT 1: il y a quelques utilisateurs qui disent que vous ne pouvez pas faire cela pour tous les modules parce que vous lisez à partir d'un système de contrôle de source, qui peut très bien contenir du code invalide / non compilé / bogué. Donc, pour être clair (même si cela va sans dire): étant donné que le code du référentiel est dans un état utilisable par npm , vous pouvez maintenant très facilement installer directement depuis github

EDIT 2: (21-10-2019) Nous vivons maintenant à travers "Peak Typescript / React / Babel", et donc la compilation JavaScript est devenue assez courante. Si vous devez prendre en compte la compilation, regardez prepare. Cela dit, les modules NPM n'ont pas besoin d'être compilés , et il est sage de supposer que la compilation n'est pas la valeur par défaut, en particulier pour les modules de nœuds plus anciens (et peut-être aussi pour les très nouveaux "ESNext" -y).

Fergie
la source
9
Vous ne pouvez pas installer le package npm que vous souhaitez à partir de sa source GitHub, à moins que le dépôt ne comprenne un distdossier, et la plupart ne le font pas. Le problème prebuildauquel j'ai lié est un bogue npm - l' étape n'est pas exécutée lors de l'installation à partir de GitHub. Par exemple, essayez d'installer node-influx / node-influx .
Dan Dascalescu
4
Les dépôts sans distdossiers PEUVENT être installés à partir de GitHub, par exemple: npm install https://github.com/fergiemcdowall/search-index-adderfonctionne parfaitement.
Fergie
4
D'accord, car vous avez directement la source usabel /lib(comme si vous aviez un dossier dist). Mon point est que l'inclusion de l'URL GitHub d'un dépôt dans package.jons n'est pas garantie de fonctionner pour l'installation de ce dépôt. Les modules écrits en TypeScript, par exemple, doivent pousser leur code transpilé dans le référentiel. Ils ne le font généralement pas, mais utilisent plutôt un script de prépublication pour vider le code .JS dans un dossier dist, qui est téléchargé sur npmjs.com.
Dan Dascalescu
2
Je sais que c'est un peu tard, mais l'astuce est en fait que npm n'a pas de mappage 1 à 1 vers les référentiels Git. Certains projets construisent leurs fichiers sources avant de les publier plutôt qu'avant de les valider, ce qui signifie qu'ils ne sont PAS dans le référentiel Git, mais seraient dans le package npm - les projets faisant cela ne fonctionneront pas directement depuis Git. Les référentiels de macros peuvent également échouer: le projet GitHub de Babel, par exemple, inclut des centaines de packages npm individuels dans des sous-dossiers. Ils peuvent être publiés individuellement car npm ne correspond pas directement à Git. npm publie tout ce qui se trouve dans votre répertoire.
John Chadwick
14
Pour tous ceux qui tomberont dessus plus tard ... À partir de npm5, npm exécutera n'importe quel preparescript pour les "installations" nues, qui incluent git deps. Ce qui signifie que les commentaires ci-dessus concernant la compilation et les dossiers dist sont obsolètes. Tout paquet qui définit correctement sa compilation pour fonctionner preparefonctionnera très bien en tant que git dep sans engager aucun actif compilé dans git.
jasonkarns
54

Il faut aussi npm install https://github.com/{USER}/{REPO}/tarball/{BRANCH}utiliser une branche différente.

zakelfassi
la source
J'ai rencontré ce problème ... github.com/yarnpkg/yarn/issues/2738 J'ai pu changer le registre en registre tarball github et cela a fonctionné .. Merci!
Matt Goo
Cela a résolu certains problèmes de performances majeurs pour moi. L'utilisation de {USER} / {REPO} .git # {BRANCH} a été très lente.
Erik Koopmans du
37

La meilleure réponse actuelle de Peter Lyons n'est pas pertinente avec les versions récentes du NPM. Par exemple, utiliser la même commande qui a été critiquée dans cette réponse est maintenant très bien.

$ npm install https://github.com/visionmedia/express

Si vous avez des problèmes persistants, cela peut être un problème avec le package que vous utilisez.

Colin D
la source
Il redirige également automatiquement vers github.com/expressjs/express lorsque vous utilisez cette commande :)
Colin D
33

Les méthodes sont assez bien couvertes maintenant dans la documentation d'installation de npm ainsi que les nombreuses autres réponses ici.

npm install git+ssh://[email protected]:<githubname>/<githubrepo.git[#<commit-ish>]
npm install git+ssh://[email protected]:<githubname>/<githubrepo.git>[#semver:^x.x]
npm install git+https://[email protected]/<githubname>/<githubrepo.git>
npm install git://github.com/<githubname>/<githubrepo.git>
npm install github:<githubname>/<githubrepo>[#<commit-ish>]

Cependant, quelque chose de notable qui a changé récemment est npm ajoutant le preparescript pour remplacer le prepublishscript. Cela corrige un problème de longue date où les modules installés via git n'exécutaient pas le prepublishscript et ne terminaient donc pas les étapes de génération qui se produisent lorsqu'un module est publié dans le registre npm. Voir https://github.com/npm/npm/issues/3055 .

Bien sûr, les auteurs du module devront mettre à jour leur package.json pour utiliser la nouvelle preparedirective pour que cela commence à fonctionner.

nextgentech
la source
19

MISE À JOUR maintenant vous pouvez faire: npm install git://github.com/foo/bar.git
ou en package.json:

"dependencies": {
  "bar": "git://github.com/foo/bar.git"
}
Sagiv Ofek
la source
19

La forme générale de la syntaxe est

<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]

ce qui signifie que pour votre cas, ce sera

npm install git+ssh://[email protected]/visionmedia/express.git

Depuis les documents npmjs:

installation de npm:

Installe le package à partir du fournisseur git hébergé, en le clonant avec git. Pour une URL distante git complète, seule cette URL sera tentée.

<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish>

| #semver:] est l'un des fichiers git, git + ssh, git + http, git + https ou git +.

Si # est fourni, il sera utilisé pour cloner exactement ce commit. Si le commit-ish a le format #semver :, peut être n'importe quelle plage de semver valide ou version exacte, et npm recherchera toutes les balises ou références correspondant à cette plage dans le référentiel distant, tout comme pour une dépendance de registre. Si ni # ni

semver: est spécifié, puis master est utilisé.

Si le référentiel utilise des sous-modules, ces sous-modules seront également clonés.

Si le package en cours d'installation contient un script de préparation, ses dépendances et devDependencies seront installées et le script de préparation sera exécuté avant que le package ne soit conditionné et installé.

Les variables d'environnement git suivantes sont reconnues par npm et seront ajoutées à l'environnement lors de l'exécution de git:

  • GIT_ASKPASS
  • GIT_EXEC_PATH
  • GIT_PROXY_COMMAND
  • GIT_SSH
  • GIT_SSH_COMMAND
  • GIT_SSL_CAINFO GIT_SSL_NO_VERIFY

Consultez la page de manuel git pour plus de détails.

Exemples:

npm install git+ssh://[email protected]:npm/npm.git#v1.0.27
npm install git+ssh://[email protected]:npm/npm#semver:^5.0
npm install git+https://[email protected]/npm/npm.git
npm install git://github.com/npm/npm.git#v1.0.27
GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://[email protected]:npm/npm.git npm install
ishandutta2007
la source
14

Installez-le directement:

npm install visionmedia/express

Alternativement, vous pouvez ajouter "express": "github:visionmedia/express"à la "dependencies"section du package.jsonfichier, puis exécuter:

npm install
Tyler Long
la source
9

Vous pourriez aussi faire

npm i alex-cory/fasthacks

ou

npm i github:alex-cory/fasthacks

Fondamentalement:

npm i user_or_org/repo_name
Alex Cory
la source
6

Vous pouvez installer directement un dépôt github par npm installcommande, comme ceci: npm install https://github.com/futurechallenger/npm_git_install.git --save

REMARQUE: Dans le dépôt qui sera installé par la commande npm:

  1. vous devez peut-être avoir une dist dossier dans votre référentiel, selon le commentaire de @Dan Dascalescu.
  2. Vous devez absolument avoir un package.json dans votre repo! que j'oublie d'ajouter.
Bruce Lee
la source
1
Vous n'avez pas besoin d'un distdossier ou d'un code de build dans votre référentiel. Il vous suffit d'utiliser un preparescript dans package.json.
Cameron Tacklind
4

Facile :

npm install *GithubUrl*.git --save

exemple :

npm install https://github.com/visionmedia/express.git --save
Khurshid Ansari
la source
0

J'ai essayé npm install git+https://github.com/visionmedia/expressmais cela a pris beaucoup trop de temps et je n'étais pas sûr que cela fonctionnerait.

Ce qui a fonctionné pour moi, c'est - yarn add git+https://github.com/visionmedia/express.

Zéphyr
la source
-3

Essayez cette commande

 npm install github:[Organisation]/[Repository]#[master/BranchName] -g

cette commande a fonctionné pour moi.

 npm install github:BlessCSS/bless#3.x -g
Rahil Lakhani
la source
12
N'UTILISEZ PAS SUDO AVEC NPM INSTALL! utilisez plutôt chown pour changer de propriétaire.
Marek Fajkus
La version est le nom de la balise / branche ou la version package.json?
mfrachet
@MarekFajkus si vous installez sur Linux via un gestionnaire de paquets en utilisant sudo ... vous devrez utiliser root si vous voulez installer des paquets globalement
Ray Foss
1
@RayFoss Un an de retard mais ... c'est seulement si vous voulez que le package installé globalement soit disponible pour tous les utilisateurs, ce qui est rarement le cas. Configurez simplement npm pour installer les packages globaux dans~/node_modules , alors vous n'aurez jamais besoin de sudo.
Mr5o1