nixで実行ファイルにversion suffixをつけてみる
nixで実行ファイルにversionを接尾辞につけてみる。
今回は具体例にnodejsをを使う。
手法としては、インストール時にバージョン番号をつけてハードリンクを貼ってみた。
nodejs_20をinstallしたときにnode20もインストールするように、nodejs_20のderivationをoverrideする。
{ pkgs ? import <nixpkgs> {} }:
pkgs.nodejs_20.overrideDerivation (drv: {
pname = "nodejs_20-prefix";
postInstall = "${drv.postInstall}
ln $out/bin/node $out/bin/node20
ln $out/bin/npm $out/bin/npm20
ln $out/bin/npx $out/bin/npx20
";
})
これを node-suffix.nix
として保存していれば、nix-build node-suffix.nix
でビルドできる。ビルドして作成したパッケージの中身を見てみる。
nix-build node-suffix.nix
ls result/
corepack node node20 npm npm20 npx npx20
これをインストールパッケージとして指定すれば使える。
nix-shellで使ってみるために以下の様に書いてみる
{ pkgs ? import <nixpkgs> { } }:
pkgs.mkShell {
packages = with pkgs;
[pkgs.nodejs_18 (import ./node.nix { pkgs = pkgs; })];
}
nix-shellを起動して、nodeのバージョンを確認する。
$ node -v
v18.17.1
$ node20 -v
v20.5.1
もっと詳しく
nodejsの中身確認
事前にnodejsのderivationがどうなっているか確認した。
nix repl
を使って nodejs_20
の中身を確認する
> (import <nixpkgs> {}).nodejs_20.outPath
"/nix/store/xxxxxxxxxxxxxxxxx-nodejs-20.5.1"
xxxの部分は人によって違うので仮埋めしている。この中身を確認するとnodeがある
$ ls /nix/store/xxxxxxxxxxxxxxxxx-nodejs-20.5.1/bin
corepack node npm npx
これらのファイルをinstall後に実行できる処理を追加できる postInstallでハードリンクしてあげることにした。postInstallにはすでに設定値があったので、node.nixでは ${drv.postInstall}
として展開している。
postInstallについてはnixpkgsのマニュアルを読むと良い
Nixpkgs Manual - install-pahse
nix-build
nix-buildはmkDerivationで作ったderivationを実際にビルドできる。resultに結果が展開される。
ふつうにパッケージとして使うにはどうするか。
shell.nixにかいた (import ./node.nix { pkgs = pkgs; })
がnodejs_20として使えるのでそのままつかえばよい。pkgs.nodejs_20として使いたいなら、以下の記事と同じようにoverrideしてしまう手もある。
Discussion