home-manager で ni コマンドを使う
はじめに
home-manager で ni コマンドを使おうとしたら少しハマったのでメモ。
TL;DL
1{ pkgs, ... }:23{4home.packages = with pkgs; [5nodePackages."@antfu/ni"6];7}
ni とは?
ni は npm、yarn、pnpm、bun といった JavaScript のパッケージを管理するためのコマンドラッパーの一つ。これらのコマンドはそれぞれサブコマンドやオプションに差違があるため、コマンドごとに使い方を覚えないといけない。 ni はこれらのコマンドを統一的に扱うためのコマンドを提供していくれる。
例えば、npm install
、yarn
、pnpm install
、bun install
は ni
というコマンドで統一的に扱うことができる。その他にも npm install
、npm install xxx
、npm ci
、npm run
、npx
、npm upgrade
、npm uninstall
といったコマンドを ni
で統一的に扱うことができる。
home-manager で ni を使う
home-manager で管理したいのであれば home.packages
に ni
を追加すれば良いと思いきや、次のように記述しても ni
コマンドはインストールできない。
1{ pkgs, ... }:23{4home.packages = with pkgs; [5ni6];7}
NixOS Search で検索をかけるとわかるが、ni
は登録されていない。
しかし、nodePackages
で扱えることが GitHub のリポジトリを見るとわかる。パッケージ名が @antfu/ni
であるため、次のように記述すれば ni
コマンドをインストールすることができるかと思いきや、これでは上手くいかない。
1{ pkgs, ... }:23{4home.packages = with nodePackages; [5@antfu/ni6];7}
Nix の文法を理解していないため、文法として制約があるかわからないが、@
から始まる変数は使えないようだ。しかし、@antfu/ni
を "@antfu/ni"
と記述すると文字列として認識されてしまい、これも上手くいかない。
最終的に with nodePackages;
を使わずに、次のように記述することで ni
コマンドをインストールすることができた。
1{ pkgs, ... }:23{4home.packages = with pkgs; [5nodePackages."@antfu/ni"6];7}
nushell と衝突
これで解決かと思いきや、もう一つ問題が発生した。
npm upgrade
相当のコマンドである nu
が nushell
と衝突してしまう。
nushell
は常用しているわけではないので nushell
の方をインストールしないように設定することで回避した。
nu
コマンドとは別に nlx
コマンド (npx
相当) はもともと nix
コマンドであったが、Nix のコマンドと衝突してしまうため名前が変更された過去がある。
nushell
が今より普及したら nu
コマンドも変更されるかもしれない。多少長くなってもいいから ni
、nu
、nr
みたいな n
に一文字を追加するような命名ではなく、ni add
、ni run
みたいな命名にして欲しい…