En raison de https://github.com/npm/npm/issues/2943 , npm ne prendra jamais en charge la possibilité de créer des alias pour les packages et d'installer plusieurs versions du même package.
Les solutions de contournement publiées sur le problème github peuvent fonctionner pour les modules JS purs, mais comme npm devient un standard pour la gestion des packages front-end, les packages incluent désormais divers actifs, tels que CSS.
Existe-t-il une solution de contournement pour installer plusieurs versions du même package?
La meilleure idée que j'ai proposée est de "cloner" un paquet et de le publier sous un nom légèrement différent.
Par exemple, si vous avez besoin de plusieurs versions de jquery
, vous pouvez simplement publier des packages appelés jquery-alias1
, jquery-alias2
, jquery-alias3
, etc., puis définir les versions appropriées dans votre package.json
.
Ou vous pouvez nommer les paquets en fonction de leur numéro de version, par exemple jquery-1.11.x
, jquery-2.1.x
, etc.
Ces deux approches semblent cependant bâclées. Y a-t-il de meilleurs?
Je voulais poster ici pour tous ceux qui, comme moi, utilisent Yarn et ont atterri ici. Il remplace plus ou moins le NPM et prend en charge les alias prêts à l'emploi:
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
(le crédit par exemple va à https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 )
Il semble que "JSPM" soit exactement l'outil que vous recherchez. JSPM s'appuie sur NPM mais vous permet d'extraire des packages de plusieurs sources (github, npm, etc.). Il utilise le chargeur de modules universel System.js sur le système frontal pour le chargement de modules et "utilise la gestion de version plate pour le téléchargement dans des dossiers avec une version suffixée" qui sont faciles à raisonner.
Lorsque vous installez un package avec jspm, vous pouvez aliaser ce package sous un nom particulier, que vous pourrez ensuite require
spécifiquement dans vos modules.
$ 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
Ensuite, dans votre js, vous pouvez simplement require(jquery)
et/ou require(jqueryOne)
si nécessaire, ce qui vous permet d’aller et venir au besoin.
Ceci est identique pour tous les packages pour lesquels vous souhaitez utiliser plusieurs versions.
C'est assez difficile à faire proprement, vu le fonctionnement de npm, j'éviterais donc d'essayer de le faire en production.
Cependant, pour les tests d'intégration et les cas d'utilisation similaires, j'ai créé un package appelé multidep , qui vous permet d'installer plusieurs versions du même package et de les remplacer par require
comme suit:
var multidepPackages = require('multidep')('test/multidep.json');
var jquery1 = multidepRequire('jquery', '1.11.3');
var jquery2 = multidepRequire('jquery', '2.1.4');
La version d'installation de NPM ( https://github.com/scott113341/npm-install-version ) est également une option. Il fait essentiellement ce que certaines des autres solutions ici font (techniquement parlant) mais est assez simple à utiliser. Les modules installés avec un numéro de version (commande standard @version utilisée par NPM) sont installés de manière prévisible dans un sous-dossier sous node_modules portant ce nom. Vous pouvez également contrôler le répertoire de destination par module, ce qui est utile avec les systèmes de construction.
Extrait de code d'utilisation des documents 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
install-npm-version
( https://github.com/scott-lin/install-npm-version ) est une autre option. Il peut être utilisé sur la ligne de commande ou via une interface de programmation - écrite en TypeScript pour le développement moderne.
Exemple n ° 1: Installation dans le répertoire versionné (par défaut)
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]/
Exemple n ° 2: Installation dans un répertoire personnalisé
import inv = require('install-npm-version');
inv.Install('[email protected]', { 'Destination': 'some/path/chalk' });
// installs [email protected] to node_modules/some/path/chalk/
Exemple 3: Installation avec une sortie standard silencieuse ou bruyante
import inv = require('install-npm-version');
inv.Install('[email protected]', { 'Verbosity': 'Silent' });
inv.Install('[email protected]', { 'Verbosity': 'Debug' });
Exemple 4: écraser une installation existante
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