npmを使用してパッケージの複数のバージョンをインストールする方法


100

以下のためにhttps://github.com/npm/npm/issues/2943、NPM別名パッケージする機能をサポートしていないし、同じパッケージの複数のバージョンをインストールありません。

githubの問題に投稿された回避策は、純粋なJSモジュールで機能する可能性がありますが、npmがフロントエンドパッケージ管理の標準になるため、パッケージにはCSSなどのさまざまなアセットが含まれるようになりました。

同じパッケージの複数のバージョンをインストールするための回避策はありますか?

私が思いついた最良のアイデアは、パッケージを「複製」し、少し異なる名前で公開することです。

あなたは複数のバージョンが必要な場合たとえば、jqueryあなたは、単にと呼ばれるパッケージ公開することができjquery-alias1jquery-alias2jquery-alias3などをして、あなたに適切なバージョンを設定しますpackage.json

それとも、そのバージョン番号、例えばに従ってパッケージに名前を付けることができjquery-1.11.xjquery-2.1.xなど。

しかし、これらのアプローチはどちらもずさんなようです。より良いものはありますか?


これを簡単に実行できるフロントエンドパッケージ管理の標準に屈することはありません。
laggingreflex 2014年

はい、バウアーはここでの代替のようです。大規模なチームに別のパッケージ管理システムを導入するのは難しい場合があるため、npmソリューションがないように思われるのは残念です。特に、npmをサポートするようにインフラストラクチャがすでに設定されている場合(プライベートnpmレジストリサーバーなど)
マークを付け

回答:


103

とおりNPM v6.9.0、 NPMは現在、パッケージの別名をサポートしています。これは、同じ構文を実装糸の用途として:

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レジストリバージョンとパッケージのGitHubフォークの両方をインストールする場合foobar

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

1
糸はまた、サポートパッケージエイリアシング
グレッグK

こんにちは、私は次の2つのパッケージをインストールする手順を試しました: "react-native-track-player": "1.1.4"および "react-native-track-player": "1.1.8"。iOSでは問題なく動作しますが、Androidでは「MusicManager $ 1が複数回定義されています」というエラーが表示されます。Androidが1.1.8をビルドしないようにするにはどうすればよいですか?
emBeCoRau

ライブラリで競合が発生しているため、iOSでは1.1.8、Androidでは1.1.4を使用する必要があります
EmBeCoRau

依存関係のエイリアスが探していたものと異なっていたためeslint、私にはeslint6
うまくいき

75

私のように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に移動します


17
ありがとうございました。一般式が<alternative-name>@npm:<package-name>@<version>
次のとおりである

5

「JSPM」はまさにあなたが探しているツールのようです。JSPMはNPMの上に構築されますが、複数のソース(github、npmなど)からパッケージをプルできます。これは、フロントエンドのSystem.jsユニバーサルモジュールローダーを使用してモジュールをロードし、「フラットバージョン管理を使用してバージョンサフィックスのフォルダーにダウンロードする」ため、簡単に推論できます。

jspm.io

jspmを使用してパッケージをインストールすると、そのパッケージを特定の名前にエイリアスできrequireます。この名前は、後でモジュールで具体的に指定できます。

$ 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

次に、jsで、単純にrequire(jquery)および/またはrequire(jqueryOne)必要に応じて、必要に応じて前後に移動できるようにします。

これは、複数のバージョンを使用するすべてのパッケージで同じです。


2

npmの動作方法が原因で、これをクリーンに実行することは非常に難しいため、本番環境で実行することは避けます。

ただし、統合テストや同様のユースケースのために、multidepというパッケージを作成しました。これにより、同じパッケージの複数のバージョンを次のようにインストールできますrequire

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

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

0

NPMインストールバージョン(https://github.com/scott113341/npm-install-version)もオプションです。これは基本的に、ここにある他のソリューションのいくつか(技術的に言えば)と同じことを行いますが、使用するのは非常に簡単です。バージョン番号(NPMで使用される標準の@versionコマンドパラメーター)でインストールされたモジュールは、その名前のnode_modulesの下のサブフォルダーに予想どおりにインストールされます。モジュールごとに宛先ディレクトリを制御することもできます。これはビルドシステムで役立ちます。

GitHubドキュメントの使用コードスニペット:

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-versionhttps://github.com/scott-lin/install-npm-version)はさらに別のオプションです。これは、コマンドラインで使用することも、最新の開発用にTypeScriptで記述されたプログラムインターフェイスを介して使用することもできます。

例1:バージョン管理された(デフォルトの)ディレクトリにインストールする

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/

例2:カスタムディレクトリにインストールする

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/

例3:サイレントまたはノイズの多い標準出力でインストールする

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

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

例4:既存のインストールを上書きする

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

私の場合、割り当てにこの古いバージョンが必要なコースを受講していたため、グローバルにインストールしたバージョンよりも古いバージョンのcreate-react-appをインストールする必要がありました。

この古いバージョンを含めるためだけに新しいフォルダを作成し、それにcdして、

npm init

このシェルpackage.jsonを設定した後、必要なcreate-react-appの正確なバージョンをインストールしました

npm install create-react-app@1.5.2

これは、古いバージョンのcreate-react-appでローカルのnode_modulesフォルダーを作成しました。

次に、この古いバージョンへのショートカットとして単純なbashスクリプト(create-react-app.sh)を作成し、bash変数「$ @」を使用してすべての引数を転送しました。

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

最後に、この単純なbashスクリプトを実行可能にしました

chmod u+x create-react-app.sh

したがって、このbashスクリプトを直接実行すると、古いバージョンのcreate-react-appが実行されます。

./create-react-app.sh  --version
1.5.2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.