cómo instalar múltiples versiones del paquete usando npm


101

Debido a https://github.com/npm/npm/issues/2943 , npm nunca admitirá la capacidad de crear alias de paquetes e instalar múltiples versiones del mismo paquete.

Las soluciones publicadas sobre el problema de github podrían funcionar para módulos JS puros, pero a medida que npm se convierte en un estándar para la administración de paquetes frontend, los paquetes ahora incluyen varios activos como CSS.

¿Existe alguna solución para instalar varias versiones del mismo paquete?

La mejor idea que se me ha ocurrido es "clonar" un paquete y publicarlo con un nombre ligeramente diferente.

Por ejemplo, si necesita varias versiones de jquery, usted podría publicar paquetes llamados jquery-alias1, jquery-alias2, jquery-alias3etc, y luego configurar las versiones adecuadas en su package.json.

O bien, podría nombrar a los paquetes en función de su número de versión, por ejemplo jquery-1.11.x, jquery-2.1.x, etc ..

Sin embargo, ambos enfoques parecen descuidados. ¿Hay mejores?


No se Bower en el estándar de gestión de paquetes frontend que puede hacer esto fácilmente .
laggingreflex

Sí, Bower parece una alternativa aquí. Es una lástima que no parece haber una solución npm, ya que presentar otro sistema de administración de paquetes a un equipo grande puede ser difícil. Especialmente si ya tiene una infraestructura configurada para admitir npm (por ejemplo, un servidor de registro privado de npm)
marque el

Respuestas:


104

A partir de npm v6.9.0, npm ahora admite alias de paquetes. Se implementa la misma sintaxis como los usos del hilo:

npm install jquery2@npm:jquery@2
npm install jquery3@npm:jquery@3

Esto agrega lo siguiente a package.json:

"dependencies": {
   "jquery2": "npm:jquery@^2.2.4",
   "jquery3": "npm:jquery@^3.4.1"
}

También es posible instalar directamente desde GitHub con esta sintaxis. Por ejemplo, si desea instalar tanto la versión de registro npm como una bifurcación de GitHub del paquete foobar:

npm install foobar
npm install foobar-fork@github:username/foobar

1
yarn también admite el alias de paquetes
Greg K

Hola, he probado estos pasos para instalar 2 paquetes: "react-native-track-player": "1.1.4" y "react-native-track-player": "1.1.8". Funciona bien en iOS, pero en Android muestra el error "MusicManager $ 1 está definido varias veces". ¿Cómo puedo evitar que Android compile 1.1.8?
EmBeCoRau

Debido a algún conflicto en la biblioteca, necesito usar 1.1.8 en iOS y 1.1.4 en Android
EmBeCoRau

No funcionó para mí ya que el alias de la dependencia difería de lo que estaba buscando, es decir, estaba buscando eslint, pero no sabía que ahora se llamabaeslint6
Crimbo

75

Quería publicar aquí para cualquier persona como yo que esté usando Yarn y haya aterrizado aquí. Es un reemplazo más o menos directo de NPM que admite la creación de alias desde el primer momento:

yarn add material-ui@latest
yarn add material-ui-next@npm:material-ui@next
then

import FlatButton from 'material-ui/FlatButton'; // v0.x
import Button from 'material-ui-next/Button'; // v1.x

(el crédito, por ejemplo, va a https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 )


17
Gracias. Solo para aclarar que la fórmula genérica es <alternative-name>@npm:<package-name>@<version>
NikosKeyz

5

Parece que "JSPM" podría ser exactamente la herramienta que está buscando. JSPM se basa en NPM pero le permite extraer paquetes de múltiples fuentes (github, npm, etc.). Utiliza el cargador de módulos universal System.js en la interfaz para cargar módulos, y "utiliza la gestión de versiones planas para descargar en carpetas con sufijos de versión" que son fáciles de razonar.

jspm.io

Cuando instala un paquete con jspm, puede asignar un alias a ese paquete con un nombre en particular, que más tarde podrá requireespecificar en sus módulos.

$ jspm install jquery
... (status msgs) ...
ok   Installed jquery as github:components/jquery@^2.1.4 (2.1.4)

$ jspm install jqueryOne=jquery@1.11.3
... (status msgs) ...
ok   Installed jqueryOne as github:components/jquery@1.11.3 (1.11.3)

      github:components/jquery 1.11.3 2.1.4

Luego, en su js, puede simplemente require(jquery)y / o require(jqueryOne)según sea necesario, lo que le permite ir y venir según sea necesario.

Esto es lo mismo para cualquier paquete del que le gustaría usar varias versiones.


2

Esto es bastante difícil de hacer de manera limpia, debido a la forma en que funciona npm, por lo que evitaría intentar hacerlo en producción.

Sin embargo, para las pruebas de integración y casos de uso similares, creé un paquete llamado multidep , que le permite instalar múltiples versiones del mismo paquete y requireasí:

var multidepPackages = require('multidep')('test/multidep.json');

var jquery1 = multidepRequire('jquery', '1.11.3');
var jquery2 = multidepRequire('jquery', '2.1.4');

0

La versión de instalación de NPM ( https://github.com/scott113341/npm-install-version ) también es una opción. Básicamente, hace lo que hacen algunas de las otras soluciones aquí (técnicamente hablando) pero es bastante sencillo de usar. Los módulos instalados con un número de versión (parámetro de comando estándar @version utilizado por NPM) se instalan de manera predecible en una subcarpeta debajo de node_modules con ese nombre. También puede controlar el directorio de destino por módulo, lo cual es útil con los sistemas de compilación.

Fragmento de código de uso de GitHub Docs:

const niv = require('npm-install-version');
const benchmark = require('./some-benchmark-function.js');

niv.install('csjs@1.0.0');
// installs csjs@1.0.0 to node_modules/csjs@1.0.0/

niv.install('csjs@1.0.1');
// installs csjs@1.0.1 to node_modules/csjs@1.0.1/

const csjs_old = niv.require('csjs@1.0.0');
const csjs_new = niv.require('csjs@1.0.1');
// require the old and new versions of csjs

benchmark([csjs_old, csjs_new], 'some-test-input');
// run our fake benchmark function on the old and new versions of csjs

0

install-npm-version( https://github.com/scott-lin/install-npm-version ) es otra opción. Se puede usar en la línea de comandos o mediante una interfaz programática, escrita en TypeScript para el desarrollo moderno.

Ejemplo n. ° 1: instalar en el directorio versionado (predeterminado)

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0');
// installs chalk@2.4.0 to node_modules/chalk@2.4.0/

inv.Install('chalk@2.4.1');
// installs chalk@2.4.1 to node_modules/chalk@2.4.1/

Ejemplo # 2: instalar en un directorio personalizado

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Destination': 'some/path/chalk' });
// installs chalk@2.4.0 to node_modules/some/path/chalk/

Ejemplo n. ° 3: instalación con salida estándar silenciosa o ruidosa

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Verbosity': 'Silent' });
inv.Install('chalk@2.4.0', { 'Verbosity': 'Debug' });

Ejemplo n. ° 4: sobrescribir una instalación existente

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Destination': 'mydir' });
// installs chalk@2.4.0 to node_modules/mydir/

inv.Install('chalk@2.4.1', { 'Destination': 'mydir' });
// does not install chalk@2.4.1 since node_modules/mydir/ already exists

inv.Install('chalk@2.4.1', { 'Destination': 'mydir', 'Overwrite': true });
// installs chalk@2.4.1 to node_modules/mydir/ by overwriting existing install

0

En mi caso, necesitaba instalar una versión anterior de create-react-app que la versión que había instalado globalmente, porque estaba tomando un curso que requería esta versión anterior para las asignaciones.

Creé una nueva carpeta solo para contener esta versión anterior, hice un cd en ella e hice un

npm init

Después de configurar este shell package.json, instalé la versión exacta de create-react-app que necesitaba

npm install create-react-app@1.5.2

que creó una carpeta local node_modules con la versión anterior de create-react-app.

Luego creé un script bash simple (create-react-app.sh) como acceso directo a esta versión anterior, y usé la variable bash "$ @" para reenviar todos los argumentos:

#!/bin/bash
{full-directory-path}/node_modules/create-react-app/index.js "$@"

Finalmente, hice este simple script bash ejecutable

chmod u+x create-react-app.sh

Entonces, ejecutar directamente este script bash ejecutará la versión anterior de create-react-app:

./create-react-app.sh  --version
1.5.2
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.