Nix Flakes下创建相对路径符号链接的技术问题
替代方案
方案1:使用builtins.path将目录纳入Nix Store
通过builtins.path把本地的emacs-config目录复制到Nix Store,再从Store创建软链到用户目录,既支持相对路径,又不受flake所在位置影响。
{ config, pkgs, ... }: let emacsConfigDir = builtins.path { path = ../emacs-config; # 基于当前emacs.nix的相对路径 name = "emacs-config"; # 给Store里的目录命名,可选但便于识别 }; in { home.file.".config/emacs".source = emacsConfigDir; }
方案2:利用当前目录变量生成绝对路径
通过当前配置文件的位置动态计算emacs-config的绝对路径,避免硬编码flake的根目录路径:
{ config, pkgs, ... }: let # 获取当前emacs.nix所在目录的绝对路径 currentModuleDir = toString ./.; # 拼接得到emacs-config的绝对路径 emacsConfigPath = "${currentModuleDir}/../emacs-config"; in { home.file.".config/emacs".source = config.lib.file.mkOutOfStoreSymlink emacsConfigPath; }
方案3:将emacs-config作为Flake Input引入
如果emacs-config是Git子模块,可以直接在flake.nix中将其声明为input,再在配置中引用:
第一步:修改flake.nix
{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; home-manager.url = "github:nix-community/home-manager"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; # 引入本地Git子模块作为input emacs-config.url = "git+file://./modules/home-manager/emacs-config"; }; outputs = inputs@{ self, nixpkgs, home-manager, emacs-config, ... }: { # 你的NixOS配置输出... }; }
第二步:在emacs.nix中引用
{ config, pkgs, inputs, ... }: { home.file.".config/emacs".source = inputs.emacs-config; }
内容的提问来源于stack exchange,提问作者Kaligule
相关产品推荐
相关产品推荐

