TL;DR
- fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った
https://github.com/ryoppippi/na.fish
nを入力すると、lockfileを考慮してnpm, yarn, pnpm, bun, denoのどれかを自動で補完してくれる
はじめに
皆さんは@antfu/ni使ってますか? niは、npm/yarn/pnpm/bun からプロジェクトの構造を読み取ってよしなにコマンドを選択、実行してくれるCLIツールです。
https://github.com/antfu-collective/ni
とても便利なのですが、いくつかの点で不満がありました。
- 機能ごとにコマンドが別れていてそのうち別コマンドと被りそう
- fishの履歴機能と相性が悪い
- fishにはabbrという機能があるのに活用できてない
そこで、fishで自分好みのものを作ることにしました。
先行事例
Nodeに依存せず、シェルスクリプトでni相当の実装をしている例はいくつかあります。
https://efcl.info/2023/03/24/ni/ https://zenn.dev/karibash/articles/0e2cdc16d0596e
またZshですが、zeno.zshのabbrを用いて今回実装したコマンド展開を行っている例もあります。 https://www.m3tech.blog/entry/zeno-zsh-abbr
作ったもの
https://github.com/ryoppippi/na.fish 作ったものは☝️です。 これをfisherでインストールし、自分の好きなコマンドをabbrとして登録することで、そのコマンドを入力した時に自動的にNode.js/Denoのパッケージマネージャを補完してくれます。 ちなみに自分はかなりdenoを使うので、ちゃっかりdenoにも対応しました。
動作の様子は冒頭にあるGIFをご覧ください。
サブコマンドの補完について
先行事例では、サブコマンドの差異を吸収するような実装がされていました。 例えば、
ni->npm install,yarn addnun->npm uninstall,yarn removenr 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のパッケージマネージャを補完してくれます。 みなさんもぜひ使ってみてください。