npm install desde Git en una versión específica

181

Supongo que he escrito un módulo para Node.js que me gustaría mantener en privado. Sé que puedo (debería) agregar la línea:

"private": "true"

al package.jsonarchivo, y también sé que puedo npm installusar este módulo usando una ruta del sistema de archivos o un enlace a un repositorio git, incluido GitHub.

También sé que puedo poner una ruta de sistema de archivos o un enlace a un repositorio git package.json, para que la dependenciesparte se vea más o menos así:

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

Lo que ahora quiero no es vincular a la última versión, sino a una específica. La única posibilidad que conozco es vincular a un commit específico usando su ID. Pero esto es mucho menos legible y peor mantenible que usar un número de versión como 0.3.1.

Entonces, mi pregunta es: ¿es posible especificar dicho número de versión de todos modos y hacer que npm busque en el repositorio de git la última confirmación que incluye esta versión?

Si no, ¿cómo resuelve este problema en sus proyectos? ¿Vive con ID de confirmación o hay una mejor solución para esto?

Golo Roden
fuente

Respuestas:

193

Una dependencia tiene que estar disponible registrypara ser instalada simplemente especificando un versiondescriptor .

Ciertamente, puede crear y usar su propio registro en lugar de registry.npmjs.orgsi sus proyectos no deberían compartirse públicamente.

Pero, si no está en un registro, tendrá que ser referenciado por URL o Git URL . Para especificar una versión con una URL de Git, incluya una apropiada <commit-ish>, como una etiqueta, al final como un fragmento de URL .

Ejemplo, para una etiqueta llamada 0.3.1:

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

Nota : El fragmento anterior muestra la URL base igual que se publicó en la pregunta.

La porción cortada ( ...) debe completarse:

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

Y, se necesitará un formato de dirección diferente cuando el acceso SSH no esté disponible:

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

Dependiendo de su sistema operativo, también puede acceder linka la dependencia en otra carpeta donde la haya clonado desde Github.

Jonathan Lonowski
fuente
1
Parece que algunos de los enlaces en esta publicación están desactualizados, ya que en su lugar conducen a 404 páginas. Lo cual es una pena, ya que parte de esto es información que he estado buscando durante bastante tiempo.
MvG
55
Etiqueté una versión específica con git tag -a "1.0.0"y presioné git push --tags, luego agregué #v1.0.0al final de la git+sshdependencia. Pero a npm updatenada pasa.
loretoparisi
3
@loretoparisi Lo siento. No quise sugerir que agregar vera necesario. Después de la #, el fragmento debe coincidir con el nombre completo de la etiqueta (u otro commitsh ) - en su caso, #1.0.0.
Jonathan Lonowski
A partir de julio de 2016, el alojamiento del propio registro se ha vuelto más complicado a medida que se están moviendo de couchdb a microservicios
Yan Foto
3
Ahora puede hacer npm i {owner}/{project}#{tag}o agregar "{library}": "github:{owner}/{project}#{tag}"a package.json en lugar de usar [email protected]ogit://github.com
Mike W
238

La respuesta aceptada no funcionó para mí. Esto es lo que estoy haciendo para extraer un paquete de github:

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

O agregándolo manualmente en package.json:

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}
surjikal
fuente
41
Si usa http / https, asegúrese de incluir el prefijo "git +":"package": "git+https://github.com/username/package.git#commit"
Ates Goral
44
Esto funcionó hasta "npm install", pero cuando intenté ejecutar mi aplicación, require ('mymodule') no pudo encontrar su paquete. Aunque el paquete está en el directorio node_modules con el mismo nombre.
Derrick
Ah, el módulo en cuestión no incluía la compilación con la confirmación específica que quería, por lo que si tiene el mismo problema, es posible que deba compilarlo manualmente.
Derrick
1
también puede usar lo #tagque generalmente apunta a un número de versión
deltree
1
@surjikal necesita etiquetar un lanzamiento antes de poder usar números de versión con git. por ejemplo, git tag -a v1.0.1 && git push --tag && git pushcomo @Jonathan Lonowski también dijo en un comentario.
dotnetCarpenter
80

Si por versión te refieres a una etiqueta o un lanzamiento, entonces Github proporciona enlaces de descarga para esos. Por ejemplo, si quiero instalar fetch versión 0.3.2 (no está disponible en npm), entonces agrego a mi package.jsondebajo dependencies:

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

La única desventaja en comparación con el enfoque de hash de confirmación es que se garantiza que un hash no represente un código modificado, mientras que una etiqueta podría reemplazarse. Afortunadamente esto rara vez sucede.

Actualizar:

En estos días, el enfoque que uso es la notación compacta para una dependencia servida por GitHub:

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

Donde commit puede ser cualquier cosa commiting, como una etiqueta. En el caso de GitHub, incluso puede soltar la inicial github:ya que es la predeterminada.

qubyte
fuente
El modo de archivo también funciona para commits; por ejemplo, `yarn add github.com
github
Solución más limpia.
Charley Bodkin
8

Mi comentario de ejemplo a @qubyte anterior se cortó, así que aquí hay algo que es más fácil de leer ...

El método @surjikal descrito anteriormente funciona para los commits de rama, pero no funcionó para un commit de árbol que estaba intentando incluir.


El modo de archivo también funciona para confirmaciones. Por ejemplo, buscar @ a2fbf83

npm :

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

hilo :

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

formato :

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


Aquí está la confirmación del árbol que requiere el /archive/modo:

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

para el commit vuex relacionado

bvj
fuente
8

Este comando instala el paquete npm username/packagedesde un git commit específico:

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

Aquí 3d0a21ccestán los primeros 8 caracteres de commit hash.

Prisacari Dmitrii
fuente
3

Describo aquí un problema que enfrenté cuando lo ejecuté npm install: el paquete no aparece en node_modules.

El problema era que el namevalor package.jsondel paquete instalado era diferente del nombre del paquete importado (clave package.jsonde mi proyecto).

Así que si el nombre del proyecto es instalada some-package(valor en su nombre package.json) y luego en el package.jsonde su proyecto de escritura: "some-package": "owner/some-repo#tag".

Andrés
fuente
Desearía haber encontrado tu respuesta antes 😓 - Acabo de resolver, con el mismo problema haciéndome luchar por un tiempo; y este namerequisito no se menciona a menudo en la red ... (no es que pueda incurrir en eso, al menos).
Kamafeather
"Agregue las dependencias de su paquete a su package.json especificando el nombre completo del paquete". - Realmente no lo enfatizo: help.github.com/en/articles/…
Kamafeather
Descubrí que npm install --save git+https://<remote-github-repo-url>es una forma bastante segura de no volver a enfrentar este problema en el futuro.
Kamafeather
2

Necesitaba ejecutar dos versiones de tfjs-core y descubrí que ambas debían construirse después de ser instaladas.

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

Luego:

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

Y finalmente, para usar las bibliotecas:

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

Esto funcionó muy bien, pero ciertamente es #hoodrat

duhaime
fuente
1
Gracias, he estado tratando de importarlo de cualquier otra manera imaginable. Tuve que ver tu fragmento para darme cuenta de que tenía que importar directamente desde el archivo.
Victor Ivens
1

Si está haciendo esto con más de un módulo y desea tener más control sobre las versiones, debe considerar tener su propio registro npm privado.

De esta manera, puede publicar sus módulos en su registro privado de npm y usar entradas package.json de la misma manera que lo haría para los módulos públicos.

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

Igor Soarez
fuente
Todos los enlaces son 404
Cyrille Pontvieux