首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nixpkgs.overlays和nixpkgs.config.packageOverrides没有反映在environment.systemPackages中

nixpkgs.overlays和nixpkgs.config.packageOverrides没有反映在environment.systemPackages中
EN

Stack Overflow用户
提问于 2022-06-30 11:19:08
回答 1查看 389关注 0票数 0

当我在nixpkgs.config.packageOverridesnixpkgs.overlays中重写一个nixpkgs.config.packageOverrides包时,environment.systemPackages中的python应用程序似乎没有使用这些重写。如何使覆盖的python3包在python3应用程序中使用?

使用nixpkgs.overlays的示例达尔文配置

代码语言:javascript
复制
{ 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中正确地应用了覆盖:

代码语言:javascript
复制
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的依赖项中:

代码语言:javascript
复制
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中也尝试了同样的方法,效果也是一样的:

代码语言:javascript
复制
{ 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)现在都使用新的定义“

EN

回答 1

Stack Overflow用户

发布于 2022-07-07 17:54:12

我也在元素上问过这个问题。问题是awscli2 2/default.nix调用python3.override {packageOverrides = …;}

代码语言:javascript
复制
  py = python3.override {
    packageOverrides = self: super: {
      …
    };
  };

不幸的是,这覆盖了我自己的.override {packageOverrides = …;}。不幸的是,您不能编写(python.override {packageOverrides = …;}).override {packageOverrides = …;}

为此,我通过签出nixpkgs并编辑awscli2 nix,将python应用程序的packageOverrides与参数中的packageOverrides组合起来:

代码语言:javascript
复制
  py = python3.override (oldargs: {
    packageOverrides = self: super: {
      …
    } // (if oldargs?packageOverrides then (oldargs.packageOverrides self super) else super);
  });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72814871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档