如何将 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 喜欢缓存它们,因为该实现适合批量执行。
我想使用来自 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 喜欢缓存它们,因为该实现适合批量执行。