You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:16:06