All You Need Is

home-manager で ni コマンドを使う

2024/10/13
NodeNixhome-manager

はじめに

home-managerni コマンドを使おうとしたら少しハマったのでメモ。

TL;DL

1
{ pkgs, ... }:
2
3
{
4
home.packages = with pkgs; [
5
nodePackages."@antfu/ni"
6
];
7
}

ni とは?

ni は npm、yarn、pnpm、bun といった JavaScript のパッケージを管理するためのコマンドラッパーの一つ。これらのコマンドはそれぞれサブコマンドやオプションに差違があるため、コマンドごとに使い方を覚えないといけない。 ni はこれらのコマンドを統一的に扱うためのコマンドを提供していくれる。

例えば、npm installyarnpnpm installbun installni というコマンドで統一的に扱うことができる。その他にも npm installnpm install xxxnpm cinpm runnpxnpm upgradenpm uninstall といったコマンドを ni で統一的に扱うことができる。

home-manager で ni を使う

home-manager で管理したいのであれば home.packagesni を追加すれば良いと思いきや、次のように記述しても ni コマンドはインストールできない。

1
{ pkgs, ... }:
2
3
{
4
home.packages = with pkgs; [
5
ni
6
];
7
}

NixOS Search で検索をかけるとわかるが、ni は登録されていない。

しかし、nodePackages で扱えることが GitHub のリポジトリを見るとわかる。パッケージ名が @antfu/ni であるため、次のように記述すれば ni コマンドをインストールすることができるかと思いきや、これでは上手くいかない。

1
{ pkgs, ... }:
2
3
{
4
home.packages = with nodePackages; [
5
@antfu/ni
6
];
7
}

Nix の文法を理解していないため、文法として制約があるかわからないが、@ から始まる変数は使えないようだ。しかし、@antfu/ni"@antfu/ni" と記述すると文字列として認識されてしまい、これも上手くいかない。

最終的に with nodePackages; を使わずに、次のように記述することで ni コマンドをインストールすることができた。

1
{ pkgs, ... }:
2
3
{
4
home.packages = with pkgs; [
5
nodePackages."@antfu/ni"
6
];
7
}

nushell と衝突

これで解決かと思いきや、もう一つ問題が発生した。 npm upgrade 相当のコマンドである nunushell と衝突してしまう。 nushell は常用しているわけではないので nushell の方をインストールしないように設定することで回避した。

nu コマンドとは別に nlx コマンド (npx 相当) はもともと nix コマンドであったが、Nix のコマンドと衝突してしまうため名前が変更された過去がある。

nushell が今より普及したら nu コマンドも変更されるかもしれない。多少長くなってもいいから ninunr みたいな n に一文字を追加するような命名ではなく、ni addni run みたいな命名にして欲しい…


Buy Me A Coffee