什么是 home.file?#
有时候你会遇到一些冷门的软件,Home Manager 的 programs 并没有为它提供专门的选项。此时,你可以利用 home.file 属性,声明一个文件链接到家目录的特定位置。
1. 基础用法
{
home.file.".config/my-app/config.txt".text = ''
setting1=true
setting2=false
'';
}- 效果:Home Manager 会在你的
~/.config/my-app/下生成一个软链接,指向/nix/store里的只读文件。
2. 引用项目中的本地文件
如果你已经有一堆写好的 .conf 文件,不想在 Nix 里重写:
{
home.file.".bashrc".source = ./dotfiles/bashrc;
}XDG Base Directory (现代方案)#
对于现代 Linux 应用,建议使用 xdg.configFile 而非直接操作家目录根。
{
xdg.configFile."kitty/kitty.conf".text = "font_size 12.0";
}这会自动把文件放到 ~/.config/kitty/kitty.conf。
executable 与 recursive 选项#
executable = true;:如果你链接的是一个脚本文件,这个选项能确保它有执行权限。recursive = true;:逐个链接目录中的文件;默认false则把目标目录整体链接到源码目录。两种方式都可以管理目录。
为什么我的配置文件变“只读”了?#
这是 Home Manager 的默认行为。
- 原因:链接指向的 Store 文件通常不可直接编辑;如果把链接替换成普通文件,下一次激活可能因文件冲突而拒绝覆盖。应在声明式源中修改。
- 教训:永远去修改你的
.nix配置,而不是/nix/store链接出来的镜像。
实战技巧:过渡方案#
如果你还没准备好把几百行 Nvim 配置全部 Nix 化:
- 把你的
.config/nvim文件夹放到 Nix 配置目录下。 - 用
home.file.".config/nvim".source = ./nvim;整个链过去。 - 等以后有空了,再慢慢拆解成独立的 Nix 模块。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。