references #
语言手册 https://nixos.org/manual/nix/stable/language/
intro & basic #
表达式语言,最后得到的是一个表达式结果。
执行文件:nix-instantiate --eval foobar.nix --stric --json | jq .
--eval
只是 parse/evalue, 并不 realise。
default.sh
& shell.nix
#
import
在文件夹中默认先导入。
shell.nix
是 nix-shell
默认运行的文件。
https://stackoverflow.com/a/44118856
experimental Nix features #
- flakes
- repl-flake
- nix-command
https://nixlang.wiki/nix/experimental_features https://nixos.org/manual/nix/stable/contributing/experimental-features
基本类型 #
Path #
- 绝对路径: 包含一个斜杠(
/
)的会被识别为路径类型, nix 会把这些路径都转换为绝对路径 - 相对路径: nix 中的相对路径都是相对于该表达式所在源代码文件所在的目录
- ~: 会被替换成 $HOME
- lookup paths: ,nix 在 NIX_PATH 环境变量中查找指定名字的路径,当 NIX_PATH 不存在时,会在 ~/.nix-defexpr/channels 中查找
attribute set #
{ a = 2; } // { b = 4; }
合并 atrribute set- 属性集可以通过 __functor 属性名,将该属性集定义成一个函数
let
add = { __functor = self: x: x + self.x; }; # 注意这里的 `self`
inc = add // { x = 1; };
in add 1
functor 是使用复杂化了事情,要克制
通过 nix-instantiate --eval
执行文件时,如果使用 --strict
启用严格模式
#
strict
是相对于 lazy
而言的。
- 保证所有的 PATH 都必须存在
- nix 会将这些文件或目录复制到 /nix/store 中,路径变量的值将变为 /nix/store/$hash-$name。
operator #
builtins.hasAttr
or?
{ x, y ? "bar" }: x + y
y 是可选的,默认是 “bar”
内建函数 #
fetchers #
nix 下载文件并存储到 /nix/store
中,并返回存储的路径。
- fetchClosure
- fetchGit
- fetchTarball
- fetchurl
模块(module) #
推导(derivation) #
- 内置函数 derivation
nix-instantiate
nix install <installable>
installable
: 能够 realise 的
#
flake output attribute: flakeref[#attrpath]
#
derivation
=> store derivation
nix-instantiate drv.nix
=> nix store 中的 .drv
文件, (下面的 $drv_path)
nix-store --realise $drv_path
realise 到 nix store 中
上面的两部就是 nix-build
/ nix build
nix derivation show $drv_path