使用 buildPythonPackage 时如何添加 nix 包?

How can I add a nix package when using buildPythonPackage?

Python部分

我有一个具有多个入口点的 python 应用程序,json_outjson_in。我可以 运行 他们都用这个 default.nix

with import <nixpkgs> {};
(
  let jsonio = python37.pkgs.buildPythonPackage rec {
    pname = "jsonio";
    version = "0.0.1";
    src = ./.;
  };
  in python37.withPackages (ps: [ jsonio ])
).env

像这样:

$ nix-shell --run "json_out"
    { "a" : 1, "b", 2 }

$ nix-shell --run "echo { \"a\" : 1, \"b\", 2 } | json_in"
    keys: a,b
    values: 1,2

系统部分

我还想在 nix shell 中调用 jq,像这样:

$ nix-shell --run --pure "json_out | jq '.a' | json_in"

但我不能,因为它不包括在内。我知道我可以使用这个 default.nix

将 jq 包含到 nix shell 中
with import <nixpkgs> {};

stdenv.mkDerivation rec {
  name = "jsonio-environment";
  buildInputs = [ pkgs.jq ];
}

它自己工作:

$ nix-shell --run --pure "echo { \"a\" : 1, \"b\", 2 } | jq '.a'"
    { "a" : 1 }

但现在我没有申请:

$ nix-shell --run "json_out | jq '.a'"
    /tmp/nix-shell-20108-0/rc: line 1: json_out: command not found

问题

我可以提供什么 default.nix 文件来包含我的应用程序和 jq 包?

我的首选方法是使用 .overrideAttrs 向环境添加额外的依赖项,如下所示:

with import <nixpkgs> {};
(
  let jsonio = python37.pkgs.buildPythonPackage rec {
    pname = "jsonio";
    version = "0.0.1";
    src = ./.;
  };
  in python37.withPackages (ps: [jsonio ])
).env.overrideAttrs (drv: {
  buildInputs = [ jq ];
})

我需要:

  • 提供 buildPythonPackage 的输出作为 mkDerivation
  • 输入的一部分
  • 省略 env。根据错误消息的提示:

    Python 'env' attributes are intended for interactive nix-shell sessions, not for building!

这是我最终得到的结果:

with import <nixpkgs> {};

let jsonio_installed = (
  let jsonio_module = (
    python37.pkgs.buildPythonPackage rec {
      pname = "jsonio";
      version = "0.0.1";
      src = ./.;
    }
  );
  in python37.withPackages (ps: [jsonio_module ])
);
in stdenv.mkDerivation rec {
  name = "jsonio-environment";
  buildInputs = [ pkgs.jq jsonio_installed ];
}