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?

marca
fuente
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
Rens Baardman
fuente
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 )

tmahle
fuente
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 [email protected]
... (status msgs) ...
ok   Installed jqueryOne as github:components/[email protected] (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.

JemBijoux
fuente
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');
Jo Liss
fuente
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('[email protected]');
// installs [email protected] to node_modules/[email protected]/

niv.install('[email protected]');
// installs [email protected] to node_modules/[email protected]/

const csjs_old = niv.require('[email protected]');
const csjs_new = niv.require('[email protected]');
// 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
SylonZero
fuente
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('[email protected]');
// installs [email protected] to node_modules/[email protected]/

inv.Install('[email protected]');
// installs [email protected] to node_modules/[email protected]/

Ejemplo # 2: instalar en un directorio personalizado

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

inv.Install('[email protected]', { 'Destination': 'some/path/chalk' });
// installs [email protected] 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('[email protected]', { 'Verbosity': 'Silent' });
inv.Install('[email protected]', { 'Verbosity': 'Debug' });

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

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

inv.Install('[email protected]', { 'Destination': 'mydir' });
// installs [email protected] to node_modules/mydir/

inv.Install('[email protected]', { 'Destination': 'mydir' });
// does not install [email protected] since node_modules/mydir/ already exists

inv.Install('[email protected]', { 'Destination': 'mydir', 'Overwrite': true });
// installs [email protected] to node_modules/mydir/ by overwriting existing install
Scott Lin
fuente
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 [email protected]

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
Stefan Musarra
fuente