如何将 nixpkgs.config.allowUnfree 传递到本地 nixpkgs 存储库

How to pass nixpkgs.config.allowUnfree to local nixpkgs repository

我想使用来自 local nixpkgs repository

的 hubstaff 包
let
  # pass config so that packages use correct allowUnfree for example
  nixpkgs-local = import /home/bjorn/projects/nixpkgs { inherit config; };
in

rec {
  config.allowUnfree = true;

  config.packageOverrides = old: {

    # packages from local nixpkgs
    inherit (nixpkgs-local) safeeyes hubstaff;
....

但是它是未释放包,所以抛出未释放包错误

$ sudo nixos-rebuild dry-build
building the system configuration...
error: Package ‘hubstaff-1.3.1-ff75f26’ in /home/bjorn/projects/nixpkgs/pkgs/applications/misc/hubstaff/default.nix:60 has an unfree license (‘unfree’), refusing to evaluate.

据我所知,我需要通过 nixpkgs.config.allowUnfree = true,但上面的 import /home/bjorn/projects/nixpkgs { inherit config; }; 不起作用


P.S.

我遇到的另一个问题是我试图查看我传入的值是什么 config.nixpkgs.allowUnfree here

{ config, pkgs, lib, ... }:

let r = {
  imports = [
    ./hardware-configuration.nix
    ./hardware-configuration-override.nix
    ./hardware-programs.nix
    /home/bjorn/projects/nixpkgs/nixos/modules/services/misc/safeeyes.nix
  ];

  ....
};

in
builtins.seq (lib.debug.showVal config.nixpkgs.allowUnfree) r

但我得到 infinite recursion error,也许有人知道如何做到这一点?

谢谢打赏者

我传递了错误的配置

也就是说, 这是 import /home/bjorn/projects/nixpkgs 期望的配置

nix-repl> c = import <nixpkgs/nixos> {}

nix-repl> c.config.nixpkgs
{ config = { ... }; overlays = [ ... ]; pkgs = { ... }; system = "x86_64-linux"; }

这是我路过的

nix-repl> c.config
{ _module = { ... }; assertions = [ ... ]; boot = { ... }; config = { ... }; containers = { ... }; dysnomia = { ... }; ec2 = { ... }; environment = { ... }; fileSystems = { ... }; fonts = { ... }; gnu = false; hardware = { ... }; i18n = { ... }; ids = { ... }; jobs = «error: The option `jobs' is used but not defined.»; kde = { ... }; krb5 = { ... }; lib = { ... }; meta = { ... }; nesting = { ... }; networking = { ... }; nix = { ... }; nixpkgs = { ... }; passthru = «error: The option `passthru' is used but not defined.»; power = { ... }; powerManagement = { ... }; programs = { ... }; security = { ... }; services = { ... }; sound = { ... }; swapDevices = [ ... ]; system = {

它是传递给 /etc/nixos/configuration.nix

的那个

修复:

{ config, pkgs }:

let
  # pass config so that packages use correct allowUnfree for example
  unfreeConfig = config.nixpkgs.config // {
    allowUnfree = true;
  };
  nixpkgs-local = import /home/bjorn/projects/nixpkgs { config = unfreeConfig; };
in

为了回答您的第二个 "P.S." 问题,以下是原因和建议。

无限递归的发生是因为模块系统需要评估每个模块的 'root' 和一些属性,如 imports 以构建代表 config 的根的术语.

通过调用 seq,您正在评估 config 的属性,而 config 本身仍在评估中。

从技术上讲,您可以通过将 seq 调用添加到属性而不是围绕整个模块来解决此问题。这样,可以在不评估 seq 调用的情况下评估 config

查看配置的更简单方法可能是将其导入 nix repl

nix-repl> c = import <nixpkgs/nixos> { configuration = ./nixos/root/default.nix; /* or the file usually called configuration.nix */ }

nix-repl> c.config.nixpkgs.config.allowUnfree
true

迭代时可以使用:r命令重新加载所有文件。 Nix 喜欢缓存它们,因为该实现适合批量执行。