¿Cómo instalar un paquete npm desde GitHub directamente?

870

Intentar instalar módulos desde github da como resultado:

ENOENT error en package.json.

Se reproduce fácilmente usando express:

npm install https://github.com/visionmedia/express arroja error.

npm install express trabajos.

¿Por qué no puedo instalar desde github?

Aquí está la salida de la consola:

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
chico mograbi
fuente
1
¿Alguien puede dar el formato package.json devDependencies?
Adam
1
@ Adam puede agregar "express": "github:visionmedia/express"a la "dependencies"sección de package.json file, luego ejecutar: npm install(como se menciona a continuación)
Danny
@danny, eso no funciona para mí. Me pregunto si había una carpeta dist en ese repositorio express para habilitarlo.
ml242

Respuestas:

1159

Porque https://github.com/visionmedia/expresses la URL de una página web y no un módulo npm. Usa este sabor:

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

o este sabor si necesitas SSH:

git+ssh://[email protected]/visionmedia/express.git
Peter Lyons
fuente
86
También puede git+https://github.com/visionmedia/express.gitusar https en lugar de ssh.
Steve Willcock
43
Tenga en cuenta que repositorio que desea instalar debe ser un módulo de NPM , debe contener un package.jsonarchivo o de lo contrario obtendrá este error: Error: ENOENT, open 'tmp.tgz-unpack/package.json'.
GabLeRoux
20
¿Qué
pasa
3
La única solución en la que pienso por ahora es especificar un compromiso con ... / express.git # commit
Gaston Sanchez
39
Vale la pena decir que es posible que deba escapar #para usar una rama específica del shell, es decir:npm install git+https://github.com/user/repo.git\#branch
mor
656

También puedes hacer la npm install visionmedia/expressinstalación desde Github

o

npm install visionmedia/express#branch

También hay soporte para instalar directamente desde un Gist, Bitbucket, Gitlab y otros formatos especializados. Mira la npm install documentación para todos ellos.

usuario2487135
fuente
19
¿Qué, sin especificar la URL? ¿Cómo sabe npm qué servicio de alojamiento de sabor está utilizando?
Jake Rayson
22
@Jake Rayson: es posible desde la versión 1.1.65 y github.comsolo funciona.
ezze
55
No funcionó para mí en Windows, solo trató de instalar desde una subcarpeta de mi directorio actual.
Jarrod Mosen
77
Tenga en cuenta que esto no funciona en instalaciones globales (es decir, npm i repo / pkg -g) a partir de npm 1.4.28
user3751385
1
@ user3751385 Las instalaciones globales parecen estar funcionando en npm 3.3.8.
XåpplI'-I0llwlg'I -
170

Si git no está instalado, podemos intentar

npm install --save https://github.com/Amitesh/gulp-rev-all/tarball/master
Amitesh
fuente
10
¡Gran respuesta! Funcionó para mí mientras que otros comandos (de otras respuestas) estaban atascados en alguna lógica de obtención de git.
Daniel Kmak
2
También puede usar nombres de etiquetas en lugar de master. Probablemente sea más seguro hacerlo de esa manera.
mpen
44
Agradable para cuando trabajas con sucursales, debes modificar tu respuesta para incluir una respuesta de formato general, no me di cuenta /tarball/al principio
Lu Roman
2
Esta es la única respuesta que funcionó para mí al instalar una dependencia desde un contenedor Docker.
Fela Maslen
1
Esto también es perfecto para no requerir que se descargue todo el repositorio. ¡Gracias!
som
59

Actualización de septiembre de 2016

La instalación desde URL de github https de vanilla ahora funciona:

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

EDITAR 1: hay un par de usuarios que comentan que no puede hacer esto para todos los módulos porque está leyendo desde un sistema de control de origen, que bien puede contener código no válido / sin compilar / con errores. Para ser claros (aunque debería ser evidente): dado que el código en el repositorio está en un estado utilizable por npm , ahora puede instalarlo muy felizmente directamente desde github

EDITAR 2: (21-10-2019) Ahora estamos viviendo a través de "Peak Typecript / React / Babel", y por lo tanto, la compilación de JavaScript se ha vuelto bastante común. Si necesita tener en cuenta la compilación, investigue prepare. Dicho esto, los módulos NPM no necesitan compilarse , y es aconsejable suponer que la compilación no es la predeterminada, especialmente para los módulos de nodos más antiguos (y posiblemente también para los muy nuevos y modernos "ESNext" -y).

Fergie
fuente
99
No puede instalar ningún paquete npm que desee desde su fuente GitHub, a menos que el repositorio incluya una distcarpeta, y la mayoría no. El problema al que me vinculé es un error npm: el prebuildpaso no se ejecuta al instalar desde GitHub. Como ejemplo, intente instalar node-influx / node-influx .
Dan Dascalescu
44
Los repositorios sin distcarpetas PUEDEN instalarse desde GitHub, por ejemplo: npm install https://github.com/fergiemcdowall/search-index-adderfunciona perfectamente.
Fergie
44
Correcto, porque tiene la fuente directamente usabel en /lib(como si tuviera una carpeta dist). Mi punto es que solo incluir la URL de GitHub de un repositorio en package.jons no garantiza que funcione para instalar ese repositorio. Los módulos escritos en TypeScript, por ejemplo, necesitan insertar su código transpilado en el repositorio. Por lo general, no hacen esto, sino que usan un script de prepublicación para volcar el código .JS en una carpeta dist, que se carga en npmjs.com.
Dan Dascalescu
2
Sé que esto es un poco tarde, pero el truco es que npm no tiene una asignación de 1 a 1 a los repositorios de Git. Algunos proyectos construyen sus archivos fuente antes de publicarlos en lugar de antes de comprometerse, lo que significa que NO están en el repositorio de Git, pero estarían en el paquete npm; los proyectos que lo hagan no funcionarán directamente desde Git. Otro ejemplo de cómo esto puede fallar son los repositorios de macros: el proyecto GitHub de Babel, por ejemplo, incluye cientos de paquetes npm individuales en subcarpetas. Se pueden publicar individualmente porque npm no se asigna directamente a Git. npm publica lo que esté en su directorio.
John Chadwick
14
Para cualquiera que se encuentre con esto más tarde ... A partir de npm5, npm ejecutará cualquier preparescript para "instalaciones" desnudas, que incluye git deps. Lo que significa que los comentarios anteriores sobre las carpetas de compilación y dist están desactualizados. Cualquier paquete que establezca correctamente su compilación para ejecutarse preparefuncionará bien como un git dep sin comprometer ningún activo compilado en git.
jasonkarns
54

También hay npm install https://github.com/{USER}/{REPO}/tarball/{BRANCH}que usar una rama diferente.

zakelfassi
fuente
Me encontré con este problema ... github.com/yarnpkg/yarn/issues/2738 Pude cambiar el registro al registro de github tarball y funcionó ... ¡Gracias!
Matt Goo
Esto resolvió algunos problemas importantes de rendimiento para mí. Usar {USER} / {REPO} .git # {BRANCH} fue muy lento.
Erik Koopmans
37

La respuesta principal actual de Peter Lyons no es relevante con las versiones recientes de NPM. Por ejemplo, usar el mismo comando que fue criticado en esta respuesta ahora está bien.

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

Si tiene problemas continuos, podría ser un problema con el paquete que estaba utilizando.

Colin D
fuente
También redirige a github.com/expressjs/express automáticamente ahora cuando usa este comando :)
Colin D
33

Los métodos se cubren bastante bien ahora en la documentación de instalación de npm, así como en las numerosas otras respuestas aquí.

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>]

Sin embargo, algo notable que ha cambiado recientemente es que npm agrega el preparescript para reemplazar el prepublishscript. Esto soluciona un problema de larga data en el que los módulos instalados a través de git no ejecutaban el prepublishscript y, por lo tanto, no completaban los pasos de compilación que se producen cuando se publica un módulo en el registro npm. Ver https://github.com/npm/npm/issues/3055 .

Por supuesto, los autores del módulo necesitarán actualizar su package.json para usar la nueva preparedirectiva para que esto comience a funcionar.

nextgentech
fuente
19

ACTUALIZACIÓN ahora puede hacer: npm install git://github.com/foo/bar.git
o en package.json:

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

La forma general de la sintaxis es

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

lo que significa que para su caso será

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

De npmjs docs:

npm install:

Instala el paquete desde el proveedor de git alojado, clonándolo con git. Para una URL remota completa de git, solo se intentará esa URL.

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

El | #semver:] es uno de los archivos git, git + ssh, git + http, git + https o git +.

Si se proporciona #, se usará para clonar exactamente esa confirmación. Si el commit-ish tiene el formato #semver :, puede ser cualquier rango semver válido o versión exacta, y npm buscará cualquier etiqueta o referencia que coincida con ese rango en el repositorio remoto, de la misma manera que lo haría para una dependencia del registro. Si ninguno # o

semver: se especifica, luego se usa master.

Si el repositorio utiliza submódulos, esos submódulos también se clonarán.

Si el paquete que se está instalando contiene un script de preparación, se instalarán sus dependencias y devDependencies, y se ejecutará el script de preparación, antes de que se empaquete e instale el paquete.

Npm reconoce las siguientes variables de entorno de git y se agregarán al entorno al ejecutar git:

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

Vea la página de manual de git para más detalles.

Ejemplos:

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
fuente
14

Instalarlo directamente:

npm install visionmedia/express

Alternativamente, puede agregar "express": "github:visionmedia/express"a la "dependencies"sección del package.jsonarchivo y luego ejecutar:

npm install
Tyler Long
fuente
9

También podrías hacer

npm i alex-cory/fasthacks

o

npm i github:alex-cory/fasthacks

Básicamente:

npm i user_or_org/repo_name
Alex Cory
fuente
6

Puede instalar directamente un repositorio de github por npm installcomando, de esta manera: npm install https://github.com/futurechallenger/npm_git_install.git --save

NOTA: En el repositorio que se instalará mediante el comando npm:

  1. tal vez tenga que tener una carpeta dist en su repositorio, según el comentario de @Dan Dascalescu.
  2. ¡Definitivamente tienes que tener un package.json en tu repositorio! que olvido agregar.
Bruce Lee
fuente
1
No necesita una distcarpeta ni ningún código de compilación en su repositorio. Solo necesita usar un preparescript package.json.
Cameron Tacklind
4

Simple :

npm install *GithubUrl*.git --save

ejemplo:

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

Lo intenté, npm install git+https://github.com/visionmedia/expresspero tardó demasiado y no estaba seguro de que funcionaría.

Lo que funcionó para mí fue - yarn add git+https://github.com/visionmedia/express.

Céfiro
fuente
-3

Prueba este comando

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

Este comando funcionó para mí.

 npm install github:BlessCSS/bless#3.x -g
Rahil Lakhani
fuente
12
¡NO USE SUDO CON NPM INSTALL! prefiero usar chown para cambiar de dueño.
Marek Fajkus
La versión es el nombre de la etiqueta / rama o la versión package.json?
mfrachet
@MarekFajkus si instala en Linux a través de un administrador de paquetes usando sudo ... tendrá que usar root si desea instalar paquetes globalmente
Ray Foss
1
@RayFoss Un año tarde pero ... eso es solo si desea que el paquete instalado globalmente esté disponible para todos los usuarios, lo cual rara vez es el caso. Simplemente configure npm para instalar paquetes globales ~/node_modules, entonces nunca necesitará sudo.
Mr5o1