nixos下mkOutOfStoreSymlink的一个神坑

mkOutOfStoreSymlink解决的痛点

有一些需要进行修改的配置文件,如果使用 nix托管 或者使用 .text .source等当时管理这些配置文件,存在两个问题:1 每次修改都需要 执行nixos-rebuild switch或home-manager switch 才能生效,浪费时间 2是配置文件只读的无法双向修改。比如常见的情况,使用cc switch修改的 claudecode/codex/opencode的配置 会导致和nix管理的冲突 紊乱。

所以 我们引入了mkOutOfStoreSymlink,可以在对应的文件位置,一般都是 home下的dotfile 软件一个软链接到 nixos-config项目实际储存的路径。实现配置文件 在 nixos-config直接修改就可以生效,也支持外部工具直接编辑 dotfile 可以同步修改到我们nixos-config 比如上文说的 cc switch. cosmic桌面的配置项

原理

实例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 pkgs, username, repoDir, lib, ... }:
let
  # repoDir= "/home/y/nixos-config"
  nvimInitLink = pkgs.runCommandLocal "nvim-init-link" { } ''
    ln -s ${lib.escapeShellArg "${repoDir}/modules/dev/configFile/nvim_init.lua"} $out
  '';

  readme = ''
    # Neovim 配置说明
  '';
in
{
  home-manager = {
    users.${username} = { config, ... }: {
      xdg.configFile."nvim/init.lua".source = nvimInitLink;
      xdg.configFile."nvim/.stylua.toml".source =
        config.lib.file.mkOutOfStoreSymlink "${repoDir}/modules/dev/configFile/nvim.stylua.toml";
      xdg.configFile."nvim/nvim.testfile".source =
        config.lib.file.mkOutOfStoreSymlink ./configFile/nvim.testfile;
      home.file.".config/nvim/nix.nvim.readme.md".text = readme;
      home.file.".config/nvim/nix.nvim.readme2.md".source = "./configFile/readme2.md";
    };
  };
}

真实测试效果

xxxx.source + pkgs.runCommandLocal 可以实现 双向同步 实时生效,软链接最后一跳

xxxx.source + config.lib.file.mkOutOfStoreSymlink “绝对路径 " 可以实现 双向同步 实时生效,软链接最后一跳

xxxx.source + config.lib.file.mkOutOfStoreSymlink “相对路径 " 实际效果 和 xxxx.source 完全一样 !!!!!

xxxx.text 不用解释

bug 神坑

config.lib.file.mkOutOfStoreSymlink + 相对路径 是完全没效果的,等同于 直接用source方法。这是一个深坑,官方文档 和 ai 都没有说明这点(2026.07.04)

如果是用相对路径 Nix path literal 会被求值时自动复制到 /nix/store,导致源文件只读且 GC 后 symlink 断链。字符串路径保持指向文件系统原始文件,支持实时编辑从而无需 rebuild。

相关阅读nixos 从0实现全集 - 目录

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计