nix-lang

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.nixnix-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) #

  • import 只是一个 builtin 的函数

  • 参数可以是文件、文件夹、压缩包

  • 如果是文件夹或者压缩包,会找到 default.nix 执行

  • 参考

推导(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