如何将nixpkgs.config.allowUnfree传入本地nixpkgs仓库并解决hubstaff报错
解决NixOS中本地nixpkgs非自由包(Hubstaff)的allowUnfree配置问题
我之前也踩过这个坑!你现在的写法有个关键顺序问题:你把config.allowUnfree放在了rec块里,但导入本地nixpkgs的时候,这个config还没被定义呢——等于你给本地nixpkgs传了个空的或者不包含allowUnfree的配置,自然会触发非自由包的报错。
问题根源
你这段代码里,nixpkgs-local = import /home/bjorn/projects/nixpkgs { inherit config; }; 先执行了,但此时config是在后面的rec块里才设置的,递归变量的初始化顺序导致本地nixpkgs根本没拿到allowUnfree = true的配置,所以Hubstaff这个非自由包被拦截了。
修正方案:先定义配置,再导入本地nixpkgs
把配置提前到let块里,确保导入本地nixpkgs时能拿到正确的allowUnfree设置:
{ config, pkgs, ... }: let # 先定义本地nixpkgs需要的配置 localNixPkgsConfig = { allowUnfree = true; # 这里可以加其他本地nixpkgs需要的配置项 }; # 用上面的配置导入本地仓库 nixpkgs-local = import /home/bjorn/projects/nixpkgs localNixPkgsConfig; in { config.packageOverrides = old: { # 从本地nixpkgs引入需要的包 inherit (nixpkgs-local) safeeyes hubstaff; # 其他自定义包... }; # 如果需要系统全局允许非自由包,也可以在这里设置(可选) # config.allowUnfree = true; }
另一种方案:复用系统的nixpkgs配置
如果你的系统已经在nixpkgs.config里设置了允许非自由包,也可以直接复用这个配置导入本地nixpkgs:
{ config, pkgs, ... }: { # 系统全局允许非自由包 nixpkgs.config.allowUnfree = true; let # 复用系统的nixpkgs配置导入本地仓库 nixpkgs-local = import /home/bjorn/projects/nixpkgs config.nixpkgs.config; in { config.packageOverrides = old: { inherit (nixpkgs-local) safeeyes hubstaff; # ... }; }; }
这样调整后,本地nixpkgs在导入时就会带上allowUnfree = true的配置,Hubstaff就能正常通过构建检查了。
内容的提问来源于stack exchange,提问作者srghma
相关产品推荐
相关产品推荐

