😽

nixで実行ファイルにversion suffixをつけてみる

2023/08/21に公開

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してしまう手もある。

https://zenn.dev/eiel/articles/ab38089aa57fd6

Discussion