fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った
TL;DR
- fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った
n
を入力すると、lockfileを考慮してnpm, yarn, pnpm, bun, denoのどれかを自動で補完してくれる
はじめに
皆さんは@antfu/ni使ってますか?
ni
は、npm/yarn/pnpm/bun からプロジェクトの構造を読み取ってよしなにコマンドを選択、実行してくれるCLIツールです。
とても便利なのですが、いくつかの点で不満がありました。
- 機能ごとにコマンドが別れていてそのうち別コマンドと被りそう
- fishの履歴機能と相性が悪い
- fishにはabbrという機能があるのに活用できてない
そこで、fishで自分好みのものを作ることにしました。
先行事例
Nodeに依存せず、シェルスクリプトでni
相当の実装をしている例はいくつかあります。
またZshですが、zeno.zshのabbrを用いて今回実装したコマンド展開を行っている例もあります。
作ったもの
これをfisherでインストールし、自分の好きなコマンドをabbrとして登録することで、そのコマンドを入力した時に自動的にNode.js/Denoのパッケージマネージャを補完してくれます。
ちなみに自分はかなりdenoを使うので、ちゃっかりdenoにも対応しました。
動作の様子は冒頭にあるGIFをご覧ください。
サブコマンドの補完について
先行事例では、サブコマンドの差異を吸収するような実装がされていました。
例えば、
-
ni
->npm install
,yarn add
-
nun
->npm uninstall
,yarn remove
-
nr dev
->npm run dev
,yarn dev
などなど。
以前はnpm
にadd
やremove
といったサブコマンドはありませんでした。yarn
、pnpm
、bun
など他のパッケージマネージャにはありますね。
またnpmでscripts
を実行する際にはrun
を使うのですが、他のパッケージマネージャではrun
を省略できますね。
しかし、自分の使っているNode v22では
-
add
やremove
がnpm
でも使える -
npm
でもrun
を省略できる
ことが確認できたため、これらのサブコマンドの差異を吸収するような実装は必要ないと判断しました。
(差異を吸収する必要があるとすれば、npm add --global
->yarn global add
くらいだと思いますが、そもそも自分はglobalのインストールをあまりしない/yarnを使わないので今回は対応していません)
まとめ
fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作りました。
自分の好きなコマンドをabbrとして登録することで、そのコマンドを入力した時に自動的にNode.js/Denoのパッケージマネージャを補完してくれます。
みなさんもぜひ使ってみてください。
Discussion