📦️
Nix FlakeでCorepack
nixのパッケージマネージャは素晴らしいんですが、フロントエンドのパッケージマネージャのバージョンを細かく合わせるのには向かない。
プロジェクトによってはpackage.jsonのpackageManagerフィールドでバージョンを細かく指定してくれているので、それを尊重したい。
ということでcorepack enableするとNixOS環境では失敗するという話と、その回避方法はこちらの記事でまとめられています。
これをnix flakeで利用したい。
ということで以下がflake版です。
{
description = "Corepack environment with a shell";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { nixpkgs, flake-utils, ... }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
corepack = with pkgs; stdenv.mkDerivation {
name = "corepack";
buildInputs = [ pkgs.nodejs-slim ];
phases = [ "installPhase" ];
installPhase = ''
mkdir -p $out/bin
corepack enable --install-directory=$out/bin
'';
};
in
{
devShells.default = with pkgs; mkShell {
packages = [ bashInteractive corepack ];
};
});
}
ついでにdirenvおよびnix-direnvとか入れておくとディレクトリに入っただけでpathが通るので便利。
とはいえ毎回上を書くのは面倒なのでテンプレートから使うのがおすすめです。
以下のコマンドをpackageManagerが設定済みなプロジェクトで実行してもらえればflake.nixと.envrcが配置されます。
$ nix flake init -t github:turtton/flake-templates#corepack
$ direnv allow
ソースはこれ
余談
上の手法は一年前ぐらいに作って以降ずっとお世話になっているわけですが、どうやらNode.js v25からCorepackは分離されてるらしい。
ということで半分供養の意味も込めてこの記事を作りました。
今後どうするのが正解なのかわかってないのでよければ教えてください。
最初の内容と矛盾してるんですが、個人的にはnixpkgsにある適当なバージョンのpnpmとかbunとか使うことに抵抗ないのでそれでいいかな〜とか思ってたりする。
Discussion