目录
  • builtins.derivation来创建derivation

  • Nix language的角度来看,一个derivation只是一个含有type = derivationattribute set

  • derivation有必要的三个元素: name system builder

  • derivation { name = "foo"; system = "fake-system"; builder = "fake-builder"; } 进行求值,会创建一个/nix/store/???.drv文件,但不会直接进行构建

  • .drv文件描述了如何构建一个derivation(attribute set)

  • build .drv文件产生output(可能有多个输出)

  • .drvout paths都在/nix/store/

  • 可以通过nix derivation show /nix/store/hash-name.drv来以json的形式查看该.drv所表示的详细信息

  • 在真正构建之前out path就已经确定了(所以后面写构建脚本时可以直接用$out,其正是已经求值出的out path路径(/nix/store/hash-name)。 只不过该路径(文件或者目录)还不存在,需要在脚本中自己创建)

  • derivationout path 只由当前版本下的Nixinputs决定,所以在构建之前就已知了,并不是由构建的结果(即out)的内容来决定的

  • 但是也有根据内容决定的out path(例如tarballout 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)