在导入nixpkgs时,使用薄片叠加的覆盖物导致`错误:属性' autoSlot'缺少'

发布于 2025-02-11 20:16:35 字数 2793 浏览 5 评论 0原文

就像标题一样;当我使用attrvalues覆盖时,例如在以下示例中:

{
    description = "Shared settings for our packages!";
    inputs = {
        nixpkgs.url = github:NixOS/nixpkgs/nixos-22.05;
        flake-utils.url = github:numtide/flake-utils;
        flake-compat = {
            url = "github:edolstra/flake-compat";
            flake = false;
        };
    };
    outputs = inputs@{ self, nixpkgs, flake-utils, ... }: with builtins; with flake-utils.lib; let
        lib = import ./package.nix nixpkgs;
        overlays = with lib; rec {
            overlays = let
                lib-overlay = import ./overlay.nix nixpkgs;
            in j.foldToSet' [
                {
                    lib = lib-overlay;
                    default = lib-overlay;
                }
                (j.imports.overlaySet {
                    dir = ./callPackages/python2;
                    func = file: final: prev: j.update.python.callPython.two final prev file;
                })
                (j.imports.overlaySet {
                    dir = ./callPackages/python3;
                    func = file: final: prev: j.update.python.callPython.three final prev file;
                })
                (j.imports.set { dir = ./overlays; recursive = true; ignores.dirs = true; })
                (j.imports.overlaySet { dir = ./callPackages; call = 1; })
            ];
            overlay = overlays.default;
            defaultOverlay = overlay;
        };
        make = system: with lib; rec {

            # This does not work
            legacyPackages = import nixpkgs { inherit system; overlays = attrValues overlays.overlays; };

            # This works
            legacyPackages = import nixpkgs { inherit system; overlays = with overlays.overlays; [ overlays.overlays.lib Python autoslot ]; };

            # Traced here
            packages = flattenTree (let _ = j.filters.has.attrs legacyPackages (unique (flatten [
                (subtractLists (attrNames nixpkgs.legacyPackages.${system}) (attrNames legacyPackages))
                (attrNames overlays.overlays)
            ])); in trace (attrNames legacyPackages.Python.pkgs.autoslot) _);

            package = packages.default;
            defaultPackage = package;
            apps.default = settings.make.app package;
            app = apps.default;
            defaultApp = app;
            devShells.default = import ./devShell.nix system self;
            devShell = devShells.default;
            defaultdevShell = devShell;
        };
    in (eachSystem allSystems make) // overlays // { inherit lib; };
}

指定叠加层手动工作,而attrvalues overlays.overlays却没有,给我错误error error:attribute:attribute:attribute “ AutoSlot”缺少

As in the title; when I use attrValues overlays, such as in the following example:

{
    description = "Shared settings for our packages!";
    inputs = {
        nixpkgs.url = github:NixOS/nixpkgs/nixos-22.05;
        flake-utils.url = github:numtide/flake-utils;
        flake-compat = {
            url = "github:edolstra/flake-compat";
            flake = false;
        };
    };
    outputs = inputs@{ self, nixpkgs, flake-utils, ... }: with builtins; with flake-utils.lib; let
        lib = import ./package.nix nixpkgs;
        overlays = with lib; rec {
            overlays = let
                lib-overlay = import ./overlay.nix nixpkgs;
            in j.foldToSet' [
                {
                    lib = lib-overlay;
                    default = lib-overlay;
                }
                (j.imports.overlaySet {
                    dir = ./callPackages/python2;
                    func = file: final: prev: j.update.python.callPython.two final prev file;
                })
                (j.imports.overlaySet {
                    dir = ./callPackages/python3;
                    func = file: final: prev: j.update.python.callPython.three final prev file;
                })
                (j.imports.set { dir = ./overlays; recursive = true; ignores.dirs = true; })
                (j.imports.overlaySet { dir = ./callPackages; call = 1; })
            ];
            overlay = overlays.default;
            defaultOverlay = overlay;
        };
        make = system: with lib; rec {

            # This does not work
            legacyPackages = import nixpkgs { inherit system; overlays = attrValues overlays.overlays; };

            # This works
            legacyPackages = import nixpkgs { inherit system; overlays = with overlays.overlays; [ overlays.overlays.lib Python autoslot ]; };

            # Traced here
            packages = flattenTree (let _ = j.filters.has.attrs legacyPackages (unique (flatten [
                (subtractLists (attrNames nixpkgs.legacyPackages.${system}) (attrNames legacyPackages))
                (attrNames overlays.overlays)
            ])); in trace (attrNames legacyPackages.Python.pkgs.autoslot) _);

            package = packages.default;
            defaultPackage = package;
            apps.default = settings.make.app package;
            app = apps.default;
            defaultApp = app;
            devShells.default = import ./devShell.nix system self;
            devShell = devShells.default;
            defaultdevShell = devShell;
        };
    in (eachSystem allSystems make) // overlays // { inherit lib; };
}

Specifying overlays manually works, while attrValues overlays.overlays does not, giving me the error error: attribute 'autoslot' missing.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玩套路吗 2025-02-18 20:16:35

其原因是每个新覆盖层没有更新的Python软件包;由 jan tojnar的回复t/prev-python-override/20066/2“ rel =“ nofollow noreferrer”>此处::

overlays =
  let
    emptyOverlay = final: prev: {};
  in
  {
    autoslot = final: prev: {
      python310 = prev.python310.override (prevArgs: {
        packageOverrides =
          let
            ourOverlay = new: old: {
              autoslot = new.callPackage ./autoslot.nix {};
            };
          in
          prev.lib.composeExtensions
            prevArgs.packageOverrides or emptyOverlay
            ourOverlay;
      });
    };
    backtrace = final: prev: {
      python310 = prev.python310.override (prevArgs: {
        packageOverrides =
          let
            ourOverlay = new: old: {
              backtrace = new.callPackage ./backtrace.nix {};
            };
          in
          prev.lib.composeExtensions
            prevArgs.packageOverrides or emptyOverlay
            ourOverlay;
      });
    };
  }

The reason for this were the Python Packages not updating with each new overlay; solved by Jan Tojnar's reply here:

overlays =
  let
    emptyOverlay = final: prev: {};
  in
  {
    autoslot = final: prev: {
      python310 = prev.python310.override (prevArgs: {
        packageOverrides =
          let
            ourOverlay = new: old: {
              autoslot = new.callPackage ./autoslot.nix {};
            };
          in
          prev.lib.composeExtensions
            prevArgs.packageOverrides or emptyOverlay
            ourOverlay;
      });
    };
    backtrace = final: prev: {
      python310 = prev.python310.override (prevArgs: {
        packageOverrides =
          let
            ourOverlay = new: old: {
              backtrace = new.callPackage ./backtrace.nix {};
            };
          in
          prev.lib.composeExtensions
            prevArgs.packageOverrides or emptyOverlay
            ourOverlay;
      });
    };
  }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文