1 derivation
用
builtins.derivation来创建derivation以
Nix language的角度来看,一个derivation只是一个含有type = derivation的attribute setderivation有必要的三个元素:namesystembuilder对
derivation { name = "foo"; system = "fake-system"; builder = "fake-builder"; }进行求值,会创建一个/nix/store/???.drv文件,但不会直接进行构建.drv文件描述了如何构建一个derivation(attribute set)build
.drv文件产生output(可能有多个输出).drv和out paths都在/nix/store/中可以通过
nix derivation show /nix/store/hash-name.drv来以json的形式查看该.drv所表示的详细信息在真正构建之前
out path就已经确定了(所以后面写构建脚本时可以直接用$out,其正是已经求值出的out path路径(/nix/store/hash-name)。 只不过该路径(文件或者目录)还不存在,需要在脚本中自己创建)derivation的out path只由当前版本下的Nix的inputs决定,所以在构建之前就已知了,并不是由构建的结果(即out)的内容来决定的但是也有根据内容决定的
out path(例如tarball的out path) ([content-addressable](https://en.wikipedia.org/wiki/Content-addressable_storage))attribute set中的outPath类似java中的toString,当求值builtins.toString { foo = ???; outPath = "some"; }时,结果是"some"总的来说,有两个阶段
- (eval/instantiate) stage 对
derivation {...}进行求值,得到.drv文件,并获得其返回值。.drv文件的中的依赖(inputDrvs)是递归求值的 - (realize/build) stage 对
.drv进行构建,创建out path,也是递归地进行构建的(先构建出inputDrvs中的out out)
- (eval/instantiate) stage 对