如何合并这些nix表达式

时间:2019-07-16 21:39:19

标签: nix

Python部分

我有一个带有多个入口点json_outjson_in的python应用程序。我可以使用此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软件包?

2 个答案:

答案 0 :(得分:1)

实现此目标的首选方法是使用def some_function(var): ... some operations on var... return var 向环境中添加其他依赖项,如下所示:

.overrideAttrs

答案 1 :(得分:1)

我需要:

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

    Python'env'属性用于交互式nix-shell   会议,而不是用于建设!

这就是我最终得到的:

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 ];
}