@ryoppippi

fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った

16 May 2024 ・ 4 min read


TL;DR

  • fishで​Node.js/Denoの​パッケージマネージャを​自動で​補完する​プラグインを​作った

https://github.com/ryoppippi/na.fish

0.gif 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 add
  • nun -> npm uninstall, yarn remove
  • nr dev -> npm run dev, yarn dev

などなど。

以前はnpmaddremoveと​いった​サブコマンドは​ありませんでした。yarnpnpmbunなど他の​パッケージマネージャには​ありますね。 また​npmでscriptsを​実行する​際にはrunを​使うのですが、​他の​パッケージマネージャではrunを​省略できますね。

しかし、​自分の​使っている​Node v22では

  • addremovenpmでも​使える
  • npmでもrunを​省略できる ことが​確認できた​ため、​これらの​サブコマンドの​差異を​吸収するような​実装は​必要ないと​判断しました。

(差異を​吸収する​必要が​あると​すれば、npm add --global->yarn global addくらいだと​思いますが、​そも​そも​自分は​globalの​インストールを​あまりしない​/yarnを​使わないので​今回は​対応していません)

まとめ

fishで​Node.js/Denoの​パッケージマネージャを​自動で​補完する​プラグインを​作りました。 自分の​好きな​コマンドを​abbrと​して​登録する​ことで、​その​コマンドを​入力した​時に​自動的に​Node.js/Denoの​パッケージマネージャを​補完してくれます。 みなさんも​ぜひ​使ってみてください。

comment on bluesky / twitter
CC BY-NC-SA 4.0 2022-PRESENT © ryoppippi