使用 buildPythonPackage 时如何添加 nix 包?
How can I add a nix package when using buildPythonPackage?
Python部分
我有一个具有多个入口点的 python 应用程序,json_out
和 json_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 ];
}
Python部分
我有一个具有多个入口点的 python 应用程序,json_out
和 json_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
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 ];
}