如何修改flake.nix自动生成nix目录并复用其内容?
自动在flake.nix中生成nix目录并构建开发环境
这是Stack Overflow问题《如何修改此flake.nix以避免每次加载Nix包》的续篇。
我原本需要手动执行以下Bash命令生成nix目录及相关文件:
mkdir nix rm -fr node_module node2nix -16 --development --input package.json --lock package-lock.json --node-env ./nix/node-env.nix --composition ./nix/default.nix --output ./nix/node-package.nix
现有用于创建Nix开发环境的flake.nix如下:
{ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; npm_pack = import ./nix { inherit pkgs ;}; in with pkgs;{ devShell = npm_pack.shell; }); }
执行命令为:
nix develop --extra-experimental-features nix-command --extra-experimental-features flakes --ignore-environment
现在希望修改该flake.nix,使其自动创建nix目录并完成环境构建,不想编写单独的Bash脚本。需要确保nodejs-16_x和node2nix已安装,已知要添加以下配置:
node2nix.url ="github:svanderburg/node2nix"; # 在input中 nodejs = pkgs.nodejs-16_x; # 在output中
可以通过在flake中使用pkgs.runCommand预先生成nix目录的文件,再导入使用。修改后的flake.nix如下:
{ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; node2nix.url = "github:svanderburg/node2nix"; }; outputs = { self, nixpkgs, flake-utils, node2nix, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; # 生成node2nix所需的nix目录文件 generatedNixDir = pkgs.runCommand "generated-nix-dir" { buildInputs = [ pkgs.nodejs-16_x node2nix.packages.${system}.default ]; # 传递项目文件作为输入 src = self; } '' mkdir -p $out # 复制package.json和package-lock.json到临时目录 cp $src/package.json $src/package-lock.json . # 执行node2nix命令生成文件 node2nix -16 --development --input package.json --lock package-lock.json \ --node-env $out/node-env.nix \ --composition $out/default.nix \ --output $out/node-package.nix # 移除node_modules(如果生成了的话) rm -fr node_modules ''; # 导入生成的nix目录 npm_pack = import generatedNixDir { inherit pkgs; }; in with pkgs; { devShell = npm_pack.shell; }); }
关键说明:
- 添加node2nix输入:在
inputs中引入node2nix仓库,确保能获取到node2nix工具。 - 用runCommand生成文件:通过
pkgs.runCommand创建派生对象,在沙箱环境中安装nodejs16和node2nix,复制项目的package文件,执行node2nix命令生成所需的nix文件,输出到$out目录。 - 导入生成的目录:直接导入
generatedNixDir(即node2nix生成的文件所在目录),替代原来的./nix。 - 自动处理依赖:执行
nix develop时会自动完成nix目录文件的生成和环境构建,无需手动提前运行脚本。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

