Nix表达式中./.的含义是什么?为何不直接使用.?
为什么在flake-compat中要用
./.而不是.? 在使用flake-compat的场景里,经常能看到这样的代码:
(import (fetchTarball https://github.com/edolstra/flake-compat/archive/master.tar.gz) { src = ./.; }).shellNix
你可能已经发现,./.和.指向的是同一个目录,比如在终端里执行以下命令就能验证:
[~/testdir]$ ll . total 24 drwxr-xr-x 2 toraritte users 4096 Jul 21 21:56 ./ drwx------ 7 toraritte users 20480 Jul 15 23:13 ../ -rw-r--r-- 1 toraritte users 0 Jul 21 21:56 lofa [~/testdir]$ ll ./. total 24 drwxr-xr-x 2 toraritte users 4096 Jul 21 21:56 ./ drwx------ 7 toraritte users 20480 Jul 15 23:13 ../ -rw-r--r-- 1 toraritte users 0 Jul 21 21:56 lofa
那为什么不直接用.呢?
核心原因是Nix语法里,.和./.的含义完全不同:
./.是明确的文件系统相对路径写法,Nix会把它解析为当前表达式文件所在的目录路径,这正是flake-compat需要的「当前项目目录」。- 但如果写
src = .,在这个函数参数的上下文里,.指代的是函数接收的参数属性集,而不是文件路径。这样flake-compat拿到的就不是项目目录,而是一个空的(或默认的)属性集,自然会导致功能异常。
所以必须用./.来明确指定当前目录路径,避免Nix把.误解析成参数属性集。
内容的提问来源于stack exchange,提问作者toraritte
相关产品推荐
相关产品推荐

