latest - Cómo instalar múltiples versiones del paquete usando npm
npm versions (6)
Debido a https://github.com/npm/npm/issues/2943 , npm nunca admitirá la capacidad de crear alias de paquetes e instalar varias versiones del mismo paquete.
Las soluciones alternativas publicadas sobre el problema de github podrían funcionar para módulos de JS puro, 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.
¿Hay alguna solución para instalar varias versiones del mismo paquete?
La mejor idea que se me ocurre es "clonar" un paquete y publicarlo con un nombre ligeramente diferente.
Por ejemplo, si necesita varias versiones de
jquery
, puede publicar paquetes llamados
jquery-alias1
,
jquery-alias2
,
jquery-alias3
, etc., y luego configurar las versiones apropiadas en su
package.json
.
O puede nombrar los paquetes de acuerdo con 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?
A partir de npm v6.9.0, npm ahora admite alias de paquetes. Implementa la misma sintaxis que utiliza Yarn:
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 la versión de registro npm y una bifurcación Github del paquete
foobar
:
npm install foobar
npm install foobar-fork@github:username/foobar
Esto es bastante difícil de hacer limpiamente, debido a la forma en que funciona npm, por lo que evitaría intentar hacerlo en producción.
Sin embargo, para pruebas de integración y casos de uso similares, creé un paquete llamado
multidep
, que le permite instalar varias versiones del mismo paquete y
require
manera:
var multidepPackages = require(''multidep'')(''test/multidep.json'');
var jquery1 = multidepRequire(''jquery'', ''1.11.3'');
var jquery2 = multidepRequire(''jquery'', ''2.1.4'');
La versión de instalación de NPM ( https://github.com/scott113341/npm-install-version ) también es una opción. Esencialmente 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 @version estándar 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, que es útil con los sistemas de compilación.
Fragmento de código de uso de los documentos de GitHub:
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
Parece que "JSPM" podría ser exactamente la herramienta que estás 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 parte frontal para cargar módulos, y "utiliza la administración de versiones planas para descargar en carpetas con sufijo de versiones" sobre las que es fácil razonar.
Cuando instala un paquete con jspm, puede asignar un alias a ese paquete con un nombre en particular, que luego puede
require
específicamente 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, simplemente puede
require(jquery)
y / o
require(jqueryOne)
según sea necesario, lo que le permite ir y venir según sea necesario.
Esto es igual para cualquier paquete del que le gustaría usar múltiples versiones.
Quería publicar aquí para cualquiera que esté usando Yarn y aterrice aquí. Es un reemplazo más o menos directo para NPM que admite alias de fábrica:
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 )
install-npm-version
(
https://github.com/scott-lin/install-npm-version
) es otra opción más.
Se puede usar en la línea de comandos o mediante una interfaz programática, escrita en TypeScript para el desarrollo moderno.
Ejemplo # 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 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 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