如何让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
相关产品推荐
相关产品推荐

