Skip to content
Snippets Groups Projects
  • Eelco Dolstra's avatar
    d4dcffd6
    Add pure evaluation mode · d4dcffd6
    Eelco Dolstra authored
    In this mode, the following restrictions apply:
    
    * The builtins currentTime, currentSystem and storePath throw an
      error.
    
    * $NIX_PATH and -I are ignored.
    
    * fetchGit and fetchMercurial require a revision hash.
    
    * fetchurl and fetchTarball require a sha256 attribute.
    
    * No file system access is allowed outside of the paths returned by
      fetch{Git,Mercurial,url,Tarball}. Thus 'nix build -f ./foo.nix' is
      not allowed.
    
    Thus, the evaluation result is completely reproducible from the
    command line arguments. E.g.
    
      nix build --pure-eval '(
        let
          nix = fetchGit { url = https://github.com/NixOS/nixpkgs.git; rev = "9c927de4b179a6dd210dd88d34bda8af4b575680"; };
          nixpkgs = fetchGit { url = https://github.com/NixOS/nixpkgs.git; ref = "release-17.09"; rev = "66b4de79e3841530e6d9c6baf98702aa1f7124e4"; };
        in (import (nix + "/release.nix") { inherit nix nixpkgs; }).build.x86_64-linux
      )'
    
    The goal is to enable completely reproducible and traceable
    evaluation. For example, a NixOS configuration could be fully
    described by a single Git commit hash. 'nixos-rebuild' would do
    something like
    
      nix build --pure-eval '(
        (import (fetchGit { url = file:///my-nixos-config; rev = "..."; })).system
      ')
    
    where the Git repository /my-nixos-config would use further fetchGit
    calls or Git externals to fetch Nixpkgs and whatever other
    dependencies it has. Either way, the commit hash would uniquely
    identify the NixOS configuration and allow it to reproduced.
    d4dcffd6
    History
    Add pure evaluation mode
    Eelco Dolstra authored
    In this mode, the following restrictions apply:
    
    * The builtins currentTime, currentSystem and storePath throw an
      error.
    
    * $NIX_PATH and -I are ignored.
    
    * fetchGit and fetchMercurial require a revision hash.
    
    * fetchurl and fetchTarball require a sha256 attribute.
    
    * No file system access is allowed outside of the paths returned by
      fetch{Git,Mercurial,url,Tarball}. Thus 'nix build -f ./foo.nix' is
      not allowed.
    
    Thus, the evaluation result is completely reproducible from the
    command line arguments. E.g.
    
      nix build --pure-eval '(
        let
          nix = fetchGit { url = https://github.com/NixOS/nixpkgs.git; rev = "9c927de4b179a6dd210dd88d34bda8af4b575680"; };
          nixpkgs = fetchGit { url = https://github.com/NixOS/nixpkgs.git; ref = "release-17.09"; rev = "66b4de79e3841530e6d9c6baf98702aa1f7124e4"; };
        in (import (nix + "/release.nix") { inherit nix nixpkgs; }).build.x86_64-linux
      )'
    
    The goal is to enable completely reproducible and traceable
    evaluation. For example, a NixOS configuration could be fully
    described by a single Git commit hash. 'nixos-rebuild' would do
    something like
    
      nix build --pure-eval '(
        (import (fetchGit { url = file:///my-nixos-config; rev = "..."; })).system
      ')
    
    where the Git repository /my-nixos-config would use further fetchGit
    calls or Git externals to fetch Nixpkgs and whatever other
    dependencies it has. Either way, the commit hash would uniquely
    identify the NixOS configuration and allow it to reproduced.