gpt4 book ai didi

nix - 导入不稳定并继承配置

转载 作者:行者123 更新时间:2023-12-03 16:52:26 27 4
gpt4 key购买 nike

我有一个 package-upgrades.nix,用于从不稳定或 fork 升级软件包。

{...}:
{
nixpkgs.config = {
packageOverrides = let
pkgsUnstable = import (
fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz
) { };
pkgsMaster = import (
fetchTarball https://github.com/NixOS/nixpkgs/archive/master.tar.gz
) { };
pkgsLocal = import (
fetchTarball https://github.com/moaxcp/nixpkgs/archive/local.tar.gz
) { };
in pkgs:
rec {
dropbox = pkgsUnstable.dropbox;
jbake = pkgsUnstable.jbake;
};
};
}

这适用于诸如 Windows 管理器之类的东西。
notion = pkgsUnstable.notion;
...
windowManager.notion.enable = true;

问题是 allowUnfree 似乎没有设置在不稳定的导入上。我想尝试这样的事情。
  pkgsUnstable = import (
fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz
) { inherit config };

这会导致未定义的配置出错。
error: undefined variable ‘config’ at /etc/nixos/package-upgrades.nix:7:10
(use ‘--show-trace’ to show detailed location information)
building Nix...
error: undefined variable ‘config’ at /etc/nixos/package-upgrades.nix:7:10
(use ‘--show-trace’ to show detailed location information)
building the system configuration...
error: undefined variable ‘config’ at /etc/nixos/package-upgrades.nix:7:10
(use ‘--show-trace’ to show detailed location information)

有什么方法可以覆盖导入的 nixpkgs 存储库中的配置?

最佳答案

你在正确的轨道上。您需要通过 config Nixpkgs 函数的参数。但是,它不在范围内。

Nix 模块基本上是一个评估属性集的函数。它是用 Nix 编写的,没有得到特殊处理,所以如果你想重用你在模块中定义的东西,你有两个选择。

  • 介绍一个let绑定(bind)并使用它来引用您的配置
  • 使用 config传递给 NixOS 模块的参数

  • 第一个选项是 Nix 语言的基本使用。第二个更具体到 NixOS 模块,尽管它会出现在其他地方。

    当配置(概念上是一组模块)被评估时,评估的结果将传递给所有模块。这是循环编程的一个示例,其中由于惰性,可以传递尚未计算的值。可能需要一些时间来习惯函数的结果作为参数传递的想法,但它非常有用。

    例如,在您的情况下,您可以使用 config 的最终值。不仅由这个模块决定,而且由你的所有模块决定,但是,它不起作用,因为对 NixOS 配置的评估似乎非常严格。

    一种解决方案是排除所有 Nixpkg 需要使用的通用配置:
    { config, ...}:
    let
    baseConfig = {
    allowUnfree = true;
    };

    pkgsUnstable = import (
    fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz
    ) { config = baseConfig; };
    pkgsMaster = import (
    fetchTarball https://github.com/NixOS/nixpkgs/archive/master.tar.gz
    ) { config = baseConfig; };
    pkgsLocal = import (
    fetchTarball https://github.com/moaxcp/nixpkgs/archive/local.tar.gz
    ) { config = baseConfig; };

    in
    {
    nixpkgs.config = baseConfig // {
    packageOverrides = pkgs: {
    dropbox = pkgsUnstable.dropbox;
    jbake = pkgsUnstable.jbake;
    };
    };
    }

    也许使用覆盖而不是 packageOverrides 是个好主意。这里。叠加层让您可以更多地分解您的配置。这里的一个直接好处是您可以在其他模块中引用您的包集,因为它们将在 pkgs 中。参数,因此您不必重写包。如果您想确保在系统配置中的任何地方都使用相同的版本,则覆盖它们是一个好主意,但是您也可以引用 pkgs.pkgsUnstable.somePackage如果您只在特定情况下需要该版本。
    { ...}:
    let

    pkgsConfig = {
    allowUnfree = true;
    };

    packageSetsOverlay = self: super: {
    pkgsUnstable = import (
    fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz
    ) { config = pkgsConfig; };
    pkgsMaster = import (
    fetchTarball https://github.com/NixOS/nixpkgs/archive/master.tar.gz
    ) { config = pkgsConfig; };
    pkgsLocal = import (
    fetchTarball https://github.com/moaxcp/nixpkgs/archive/local.tar.gz
    ) { config = pkgsConfig; };
    };

    upgradesOverlay = self: super: {
    dropbox = super.pkgsUnstable.dropbox;
    jbake = super.pkgsUnstable.jbake;
    };

    overlays = [ packageSetsOverlay
    upgradesOverlay
    ];
    in
    {
    nixpkgs.overlays = overlays;
    nixpkgs.config = pkgsConfig;
    }

    关于nix - 导入不稳定并继承配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48733553/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com