https://github.com/npm/npm/issues/294 が原因で、npmはパッケージをエイリアスし、同じパッケージの複数のバージョンをインストールする機能をサポートしません。
Githubの問題に投稿された回避策はpure-JSモジュールで機能する可能性がありますが、npmがフロントエンドパッケージ管理の標準になると、パッケージにはCSSなどのさまざまなアセットが含まれるようになりました。
同じパッケージの複数のバージョンをインストールする回避策はありますか?
私が思いついた最良のアイデアは、パッケージを「クローン」し、少し異なる名前で公開することです。
たとえば、jquery
の複数のバージョンが必要な場合は、jquery-alias1
、jquery-alias2
、jquery-alias3
などと呼ばれるパッケージを公開し、package.json
で適切なバージョンを設定できます。
または、jquery-1.11.x
、jquery-2.1.x
など、バージョン番号に従ってパッケージに名前を付けることもできます。
ただし、これらのアプローチはどちらもずさんなように見えます。より良いものはありますか?
Yarn を使用している私のような人のためにここに投稿したかったのです。ほぼそのままのエイリアスをサポートするNPMの多かれ少なかれドロップイン置換です。
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
(たとえば、クレジットは https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 に移動します)
npm v6.9.0、 現在、npmはパッケージエイリアスをサポートしています。 It 同じ構文を実装 Yarnが使用するもの:
npm install jquery2@npm:jquery@2
npm install jquery3@npm:jquery@3
これにより、以下がpackage.json
に追加されます。
"dependencies": {
"jquery2": "npm:jquery@^2.2.4",
"jquery3": "npm:jquery@^3.4.1"
}
この構文を使用してGithubから直接インストールすることもできます。たとえば、npmレジストリバージョンとパッケージfoobar
のGithubフォークの両方をインストールする場合:
npm install foobar
npm install foobar-fork@github:username/foobar
「JSPM」がまさにあなたが探しているツールのようです。 JSPMはNPMの上に構築されますが、複数のソース(github、npmなど)からパッケージをプルできます。フロントエンドのSystem.jsユニバーサルモジュールローダーを使用してモジュールをロードし、「フラットバージョン管理を使用して、バージョンサフィックスが付いたフォルダーにダウンロードします」と簡単に判断できます。
Jspmを使用してパッケージをインストールする場合、そのパッケージを特定の名前にエイリアスできます。これは、後でモジュール内でrequire
に具体的に指定できます。
_$ 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
_
次に、jsで、必要に応じて単にrequire(jquery)
および/またはrequire(jqueryOne)
を使用して、必要に応じて前後に移動できます。
これは、複数のバージョンを使用するパッケージでも同じです。
Npmが機能する方法のため、これをきれいに行うのは非常に難しいので、実稼働環境で実行しようとすることは避けます。
ただし、統合テストおよび同様の使用例のために、 multidep というパッケージを作成しました。これにより、同じパッケージの複数のバージョンをインストールし、require
を次のようにインストールできます。
var multidepPackages = require('multidep')('test/multidep.json');
var jquery1 = multidepRequire('jquery', '1.11.3');
var jquery2 = multidepRequire('jquery', '2.1.4');
NPMインストールバージョン( https://github.com/scott113341/npm-install-version )もオプションです。基本的には、ここでの他のソリューションのいくつかが(技術的には)行うことを行いますが、使用するのは非常に簡単です。バージョン番号(NPMで使用される標準の@versionコマンドパラメーター)でインストールされたモジュールは、node_modulesの下のサブフォルダーにその名前で予想どおりにインストールされます。モジュールごとに宛先ディレクトリを制御することもできます。これはビルドシステムで役立ちます。
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
install-npm-version
( https://github.com/scott-lin/install-npm-version )はさらに別のオプションです。コマンドラインで使用することも、プログラムインターフェイスを介して使用することもできます。これは、最新の開発用にTypeScriptで記述されています。
例#1:バージョン管理された(デフォルト)ディレクトリにインストールする
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]/
例#2:カスタムディレクトリにインストールする
import inv = require('install-npm-version');
inv.Install('[email protected]', { 'Destination': 'some/path/chalk' });
// installs [email protected] to node_modules/some/path/chalk/
例3:サイレントまたはノイズの多い標準出力でインストールする
import inv = require('install-npm-version');
inv.Install('[email protected]', { 'Verbosity': 'Silent' });
inv.Install('[email protected]', { 'Verbosity': 'Debug' });
例#4:既存のインストールを上書きする
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