web-dev-qa-db-ja.com

Node applicationの同じnpmパッケージの2つのバージョン

私は、開発中の別のNodeJsパッケージ(SDK)を使用するNodeJSのCLIツールに取り組んでいます。

問題は、そのSDKのV2バージョンを公開したばかりで、CLIユーザーにレガシーモードを提供したいので、SDKの最初または2番目のバージョンを使用できるようにすることです。

$ cli do-stuff
#execute sdk v2

または

$ LEGACY_MODE='on' cli do-stuff
#execute sdk v1

私の問題は、CLIで同じ依存関係の2つのバージョンを使用する明確な方法を見つけられなかったことです。 npm-install-version パッケージを使用しようとしました。私のローカル環境ではうまく機能しますが、CLIを公開してnpm install -g my-cliを実行すると、/usr/local/lib/node_modules/my-cliフォルダーではなく、現在のフォルダーにnode_modulesフォルダーを作成するため、機能しなくなります。 multidep も試しましたが、同じ問題があります。

今のところ、私のpackage.jsonには私のSDKがまったく含まれていませんが、次のようなものが欲しいです:

"dependencies": {
  "my-sdk": "2.0.0"
  "my-sdk-legacy": "1.0.0"
}

または

"dependencies": {
  "my-sdk": ["2.0.0", "1.0.0"]
}

私はまだ何も見つけていません。私のSDKパッケージの最初のバージョンを「my-sdk-legacy」のような別の名前で公開することを考えていますが、可能であればそれを避けたいと思います。

そのための解決策はありますか?

19
Greg

したがって、これは実際には非常に一般的なシナリオであり、数回対処されました。

npm には未解決の問題があり、 yarn パッケージマネージャーには未解決の問題があります。


最初の解決策は、NPMの著者によって this GHコメントで提案されました。

別の名前で別のパッケージを公開します。内部に特定のバージョンが必要です。

{ "name": "express3",
  "version": "1.0.0",
  "description":"Express version 3",
  "dependencies": { "express":"3" } }

// index.js
module.exports = require('express')

あなたの場合、あなたは公開しますmy-sdk-v1およびmy-sdk-v2。また、競合を起こすことなく、1つのプロジェクトに2つのバージョンのパッケージを簡単にインストールできるようになりました。

const mySDKLegacy = require('my-sdk-v1');
const mySDKModern = require('my-sdk-v2');

2番目の方法 提案されたアイデアとほとんど同じ-git urlを使用します。

{
    "my-sdk-v1": "git://github.com/user/my-sdk#1.0.0",
    "my-sdk-v2": "git://github.com/user/my-sdk#2.0.0"
}

Npmパッケージとは異なり、任意の名前を自由に選択できます!真実の源はgit urlです。

後でnpm-install-version 現れた。 Buuut、すでに証明したように、その使用法は少し制限されています。子プロセスを生成していくつかのコマンドを実行し、tmp dirsに書き込むためです。 CLIの最も信頼できる方法ではありません。

要約すると、選択肢1と2が残っています。githubのリポジトリ名とタグは変更される可能性があるため、最初の選択肢に固執します。

より頻繁に依存するようにバージョンを変更する場合は、git urlを使用した2番目のオプションの方が適しています。 my-sdk-v1レガシー用のセキュリティパッチを公開するとします。 git urlを参照してからmy-sdk-v1.1何度もnpmに。

22
Vlad Holubiev

同様の質問に対する私の答え:

npm v6.9.0、 現在、npmはパッケージエイリアスをサポートしています。 It 同じ構文を実装 Yarnが使用するもの:

npm install my-sdk-legacy@npm:my-sdk@1
npm install my-sdk

これにより、以下がpackage.jsonに追加されます。

"dependencies": {
  "my-sdk-legacy": "npm:my-sdk@^1.0.0",
  "my-sdk": "2.0.0"
}

これは私が利用できる最もエレガントなソリューションのようで、 @ Aivusが提案した糸のソリューション と互換性があります。

13
Rens Baardman

したがって、現在のソリューションに追加するだけで、次のようなパッケージを提供することもできます。

yarn add my-sdk-newest@npm:my-sdk

またはpackage.json

{
  ...
  "my-sdk-newest": "npm:my-sdk",
  "my-sdk": "1.0.0"
  ...
}

特定のレガシーバージョンと最新バージョンのみに関心がある場合。

7
Aivus