私は、開発中の別の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」のような別の名前で公開することを考えていますが、可能であればそれを避けたいと思います。
そのための解決策はありますか?
したがって、これは実際には非常に一般的なシナリオであり、数回対処されました。
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に。
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が提案した糸のソリューション と互換性があります。
したがって、現在のソリューションに追加するだけで、次のようなパッケージを提供することもできます。
yarn add my-sdk-newest@npm:my-sdk
またはpackage.json
{
...
"my-sdk-newest": "npm:my-sdk",
"my-sdk": "1.0.0"
...
}
特定のレガシーバージョンと最新バージョンのみに関心がある場合。