niという npm/yarn/pnpm/bun を同じコマンドでインストール/アンストールコマンドを実行できるツールがあります。

仕組み的には、各パッケージのロックファイルやCorepackで決められたpackageManagerフィールドの値から、どのパッケージマネージャを使うかを判断しています。 たとえば、package-lock.jsonがあるプロジェクトなら npm を使ってるので、niコマンドは npm のコマンドを実行します。 また、packageManagerフィールドがyarn@<version>になっている場合は、niコマンドは yarn コマンドを実行します。

なぜこういうツールが必要になるかというと、npm や yarn などのパッケージマネージャは、それぞれのパッケージマネージャのコマンドが異なるためです。 たとえば、npm ではnpm install <pkg>でパッケージを追加できますが、yarn ではyarn add <pkg>でパッケージを追加します。

色々なオープンソースプロジェクトをやっていると、プロジェクトで npm/yarn/pnpm/bun など使ってるものが異なるので、コマンドを意識して使い分ける必要が出てきて大変です。 niはこれをn?というコマンド一つにまとめるというものです。

antfu/niを使うのも良いと思ったのですが、Node.js である必要性もあんまりないのと、それぞれがコマンドとして実装されていて名前が被りそうな問題が気になりました。 たとえば、npm runに相当するのがnrで、npm upgradeに相当するのがnuという形になっています。

これだと、コマンドが増えると別のコマンドと被りそうなので、ni runのようにサブコマンドにした方がいいかなと思いました。

そこで、zsh で実装してみました。

ni.zsh

実装は次のリポジトリにあります。

1 ファイルだけのシンプルなものなので、次のようにダウンロードして使うことができます。

curl https://raw.githubusercontent.com/azu/ni.zsh/main/ni.zsh > ni.zsh
source ni.zsh

あんまり zsh スクリプトの適切な配布がわからないので、誰かがいい感じにしてくれると思います。

オリジナルのniとは違って、サブコマンドとして実装しているので、ni runのようにサブコマンドを使うことができます。

ni                      -- install current package.json | npm install相当
ni add <pkg>            -- add package                  | npm install <pkg>相当
ni remove <pkg>         -- remove package         | npm uninstall <pkg>相当
ni run <script>         -- run scripts                  | npm run <script>相当
ni test                 -- run test script              | npm test相当
ni upgrade              -- upgrade packages             | npm upgrade相当
ni upgrade-interactive  -- upgrade package interactively| npmにはないのでnpm-check -uを使う

内部的には、ロックファイルとpackageManagerフィールドを見て、どのパッケージマネージャを使うかを判断するのは大体同じです。 ni <Tab> でサブコマンドを Auto Complete できるようになっています。

コマンド npm yarn pnpm bun
ni npm install yarn install pnpm install bun install
ni add <pkg> npm install yarn add pnpm add bun add
ni remove <pkg> npm uninstall yarn remove pnpm remove bun remove
ni run <script> npm run yarn run pnpm run bun run
ni test npm run test yarn run test pnpm run test bun run test
ni upgrade npm upgrade yarn upgrade pnpm update ○
ni upgrade-interactive npm-check -u yarn upgrade-interactive pnpm update -i ○

Note

自分が Yarn v2+を使ってるプロジェクトを持ってないので、Yarn v2+のプロジェクトは多分対応できてません。 また、pnpm と bun も結構適当に書いているので、実際に動いてるかはわかりません。この辺は PR 待っています。

ライセンスは MIT ライセンスで、1 ファイルなので自分の用途に合わせて加工して使ってもらっても大丈夫です。