如何在Nix Derivation中覆写已有软件包集的配置?
解决Nix包集添加配置的问题
直接修改传入的pkgs对象的config属性无效,因为pkgs是已经实例化完成的包集,config是导入nixpkgs时的初始化参数,并非包集本身的可修改属性。要应用相同配置,你需要重新实例化nixpkgs包集,复用原包集的来源并传入你的配置:
方法一:重新导入nixpkgs并添加全局配置
从传入的pkgs中获取nixpkgs的源路径,重新执行导入逻辑并加入你的配置,确保包集版本和原传入的一致:
{ pkgs, ... }: let pkgsWithConfig = import pkgs.path { # 填入你原来的配置内容 config = { # 示例配置:允许非自由软件 # allowUnfree = true; # 其他自定义配置项... }; # 可选:保留原pkgs的overlays(如果需要继承原有覆盖逻辑) overlays = pkgs.overlays; }; in pkgsWithConfig.path.to.derivation
方法二:局部修改单个包(无需全局重实例化)
如果你的配置仅针对特定包,而非全局生效,可以直接用overrideAttrs修改目标包的属性,无需重新实例化整个包集:
{ pkgs, ... }: let modifiedPkg = pkgs.path.to.derivation.overrideAttrs (oldAttrs: { # 在这里修改包的具体属性,比如编译参数、依赖等 configureFlags = oldAttrs.configureFlags ++ [ "--enable-custom-feature" ]; }); in modifiedPkg
核心要点
config参数仅在import <nixpkgs>初始化包集时生效,实例化后的包集无法通过修改属性来追加配置。- 重新导入时使用
pkgs.path,能保证复用原包集对应的nixpkgs版本,避免版本不一致的问题。
内容的提问来源于stack exchange,提问作者Cigarette Smoking Man
相关产品推荐
相关产品推荐

