当我在nixpkgs.config.packageOverrides或nixpkgs.overlays中重写一个nixpkgs.config.packageOverrides包时,environment.systemPackages中的python应用程序似乎没有使用这些重写。如何使覆盖的python3包在python3应用程序中使用?
使用nixpkgs.overlays的示例达尔文配置
{ config, pkgs, lib, ... }:
{
environment.systemPackages =
[
pkgs.myawscli2
];
nixpkgs.overlays = let overlayRemovePyopenssl = self: super:
let removePyopenssl = pythonpkgs:
lib.filter
(pythonpkg: !(pythonpkg != null && pythonpkg ? pname && pythonpkg.pname == "pyopenssl"))
pythonpkgs;
in {
python3 = super.python3.override {
packageOverrides = python-self: python-super: rec {
# Delete pyopenssl; workaround for broken package on darwin-aarch64
# “Package ‘python3.10-pyopenssl-22.0.0’ in /nix/store/<hash>-nixpkgs/nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix:73 is marked as broken, refusing to evaluate”
# https://github.com/NixOS/nixpkgs/issues/174457
urllib3 = python-super.urllib3.overridePythonAttrs (origattrs: rec {
propagatedBuildInputs = removePyopenssl origattrs.propagatedBuildInputs;
});
twisted = python-super.twisted.overridePythonAttrs (origattrs: {
checkInputs = removePyopenssl origattrs.checkInputs;
});
};
};
myawscli2 = (self.awscli2.override {
# override the python3 arg of awscli2
# https://github.com/NixOS/nixpkgs/blob/f72be3af76fb7dc45e2088d8cb9aba1e6767a930/pkgs/tools/admin/awscli2/default.nix#L2
python3 = self.python3;
});
}; in
[
overlayRemovePyopenssl
];
system.stateVersion = 4;
}在单独的python包urllib3中正确地应用了覆盖:
nix-repl> lib = import <nixpkgs>.lib
nix-repl> :l <darwin>
nix-repl> lib.forEach pkgs.python3.pkgs.urllib3.propagatedBuildInputs (x: x.pname)
[ "brotli" "certifi" "cryptography" "idna" "python3" ]但是,覆盖没有应用于使用urllib3的python应用程序。请注意,pyopenssl在被urllib3使用时处于awscli2的依赖项中:
nix-repl> lib.forEach (lib.findFirst (x: x.pname == "urllib3") null pkgs.awscli2.propagatedBuildInputs).propagatedBuildInputs (x: x.pname)
[ "brotli" "certifi" "cryptography" "idna" "pyopenssl" "python3" ]我在nixpkgs.config.packageOverrides中也尝试了同样的方法,效果也是一样的:
{ config, pkgs, lib, ... }:
{
environment.systemPackages =
[
pkgs.myawscli2
];
nixpkgs.config.packageOverrides = super:
let removePyopenssl = pythonpkgs:
lib.filter
(pythonpkg: !(pythonpkg != null && lib.hasAttr "pname" pythonpkg && pythonpkg.pname == "pyopenssl"))
pythonpkgs;
in {
python3 = super.python3.override {
packageOverrides = python-self: python-super: rec {
# workaround for
# “Package ‘python3.10-pyopenssl-22.0.0’ in /nix/store/<hash>-nixpkgs/nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix:73 is marked as broken, refusing to evaluate”
# https://github.com/NixOS/nixpkgs/issues/174457
urllib3 = python-super.urllib3.overridePythonAttrs (origattrs: rec {
propagatedBuildInputs = removePyopenssl origattrs.propagatedBuildInputs;
});
twisted = python-super.twisted.overridePythonAttrs (origattrs: {
checkInputs = removePyopenssl origattrs.checkInputs;
});
};
};
myawscli2 = (pkgs.awscli2.override {
python3 = pkgs.python3;
});
};
system.stateVersion = 4;
}这似乎与尼克斯手册的观点相矛盾,该组织称:“pythonPackages.twisted现在已被全球覆盖。引用twisted的所有包和所有twisted服务(如services.buildbot-worker)现在都使用新的定义“
发布于 2022-07-07 17:54:12
我也在元素上问过这个问题。问题是awscli2 2/default.nix调用python3.override {packageOverrides = …;}
py = python3.override {
packageOverrides = self: super: {
…
};
};不幸的是,这覆盖了我自己的.override {packageOverrides = …;}。不幸的是,您不能编写(python.override {packageOverrides = …;}).override {packageOverrides = …;}
为此,我通过签出nixpkgs并编辑awscli2 nix,将python应用程序的packageOverrides与参数中的packageOverrides组合起来:
py = python3.override (oldargs: {
packageOverrides = self: super: {
…
} // (if oldargs?packageOverrides then (oldargs.packageOverrides self super) else super);
});https://stackoverflow.com/questions/72814871
复制相似问题