You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Nix Home Manager将指定包视为Emacs的运行时依赖?

问题:将Emacs运行时依赖与Emacs包关联(Home Manager配置)

我当前的Home Manager配置中,home.packages包含Emacs及其运行时依赖:

home.packages = with pkgs; [
    # Development
    emacs

    # Development - Emacs - Base
    ripgrep
    fd
    (nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; })

    # Development - Emacs - Shell script linting
    shellcheck-minimal

    # Development - Emacs - Web
    html-tidy
    stylelint
    jsbeautifier

    ...
];

除Emacs外的其他包都是Emacs配置所需的运行时依赖,我希望把这些依赖和Emacs关联起来,让配置更清晰、有作用域。

我尝试了用overrideAttrs给Emacs添加buildInputs,但这些依赖只在Emacs构建阶段可用,构建完成后不会被保留:

# Development
(emacs.overrideAttrs (old: rec {
  buildInputs = old.buildInputs ++ [
    # Base
    ripgrep
    fd
    (nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; })

    # Shell script linting
    shellcheck-minimal

    # Web
    html-tidy
    stylelint
    jsbeautifier
  ];
}))

请问有没有办法让Home Manager将这些包视为Emacs的运行时依赖?


解决方案

你可以用pkgs.buildEnv创建一个包含Emacs及其所有运行时依赖的复合包,这样在home.packages中只需要添加这个复合包,就能自动安装所有关联的依赖,同时实现依赖与Emacs的作用域绑定:

home.packages = with pkgs; [
  (buildEnv {
    name = "emacs-with-runtime-deps";
    # 列出Emacs和所有运行时依赖
    paths = [
      emacs
      # Base依赖
      ripgrep
      fd
      (nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; })
      # Shell脚本检查依赖
      shellcheck-minimal
      # Web开发相关依赖
      html-tidy
      stylelint
      jsbeautifier
    ];
    # 将包中的bin和share目录链接到环境中,确保Emacs和依赖命令都能被找到
    pathsToLink = [ "/bin" "/share" ];
    # 可选:设置环境变量,比如把依赖的man页路径也加入
    extraOutputsToInstall = [ "man" ];
  })
];

原理说明

buildEnv会把多个包合并成一个单一的环境包,安装这个包时,所有包含在paths里的包都会被安装到系统中,同时它们的可执行文件、资源文件等会被统一链接到环境的对应目录下,保证Emacs运行时能找到这些外部命令。

如果需要更精细地控制Emacs的启动环境,也可以结合wrapProgram修改Emacs的启动脚本,把依赖的bin目录添加到PATH中,但这种方式仍需要单独将依赖包加入home.packages,buildEnv的方式更贴合你“作用域绑定”的需求。


内容的提问来源于stack exchange,提问作者Sassa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:35:14