什么是nix-instantiate有用?什么是商店推导?

时间:2015-07-18 10:34:24

标签: nixos nix

manual中写道:

  

命令nix-instantiate从中生成存储派生   (高级)Nix表达。

但什么是商店派生?

手册中说明了以下store derivations

  

构建操作的描述。推导的结果是商店   宾语。通常使用Nix表达式指定派生   推导原语。这些都被翻译成了低级商店   推导(由nix-env和nix-build隐式显示,或由   尼克斯实例化)

这对于nix-newbee来说有点难以理解,我发现通过谷歌搜索没有更多关于nix-instantiate和store派生的启发。我也问#nixos,但我没有回答。

有人可以在一个简单的例子中解释一下商店的推导是什么,它用于什么?

为什么要使用nix-instantiate生成商店派生?你能给出一个超级简单易懂的例子吗?

2 个答案:

答案 0 :(得分:24)

  

nix-instantiate的优点是什么?

命令nix-instantiate唯一目的是评估Nix表达式。 Nix语言的主要目的是生成派生。

  

什么是商店派生?

派生(see example)是用于构建(实现)包的构建配方的计算机友好表示。它们是商店目录中列出的扩展名为.drv的文件,通常为/nix/store

这些构建配方由Nix守护程序理解,用于确保所有依赖项之前构建并存储在预先计算的路径中。一旦成功编译了所有依赖项,Nix守护程序就可以查找替换,或者在本地实现派生。所有详细说明均可在Eelco Dolstra PhD Thesis中找到。

每次nix-instantiate命令评估Nix语言的derivation函数时,都会创建这些文件,除非提供了--eval命令行选项。

  

为什么要使用nix-instantiate生成商店派生?

如果您对构建输出感兴趣,则应该更喜欢nix-build,这相当于:

$ nix-store -r $(nix-instantiate '<nixpkgs>' -A hello)

在某些情况下,您对构建结果不感兴趣,但在查看编译时依赖性时。例如,如果您希望调查hello的构建时依赖性。然后使用nix-store命令,如下所示,您可以请求构建配方的所有依赖项:

$ nix-store --tree -q $(nix-instantiate '<nixpkgs>' -A hello)

答案 1 :(得分:2)

所有引号均来自Eelco Dolstra's PhD thesis

商店衍生产品

商店派生Nix expression,所有 删除可变性,并 翻译 为其他格式。 此中间表示“ 描述一个 可以将 内置到软件组件中的单一,静态,持续的构建操作”。

Nix表达式通常转换为商店衍生图。

换句话说,

*------------------------------------------------------*
|                                                      |
| NIX EXPRESSION == function                           |
|                                                      |
| ( Describes how to build a component. That is, how ) |
| ( to  compose  its  input parameters, which can be ) |
| ( other components as well.                        ) |
|                                                      |
| STORE DERIVATION == function application             |
|                                                      |
| ( Call a  Nix  expression with concrete arguments. ) |
| ( Corollary: a single Nix  expression  can produce ) |
| ( different derivations depending on the inputs.   ) |
|                                                      |
*------------------------------------------------------*

对于上下文:

Two-stage building of Nix expressions. nix-instantiate translates Nix expressions into store derivations, and nix-store --realize builds the derivation into a software component. 图片取自“ 2.4商店派生”部分。


thesis将Nix表达式描述为 与“ 构建操作族”相对, 就是“ 完全是一个构建动作”。

                              ARG_1, ..., ARG_N

                        | ---(aaa, ...)---> DERIVATION_1
        NIX EXPRESSION  | ---(bbb, ...)---> DERIVATION_2
                        |       :
           function(    |       :
             param_1,   |       :
             ...,       |       :
             param_N    |       :
             )          |       :
                        | ---(zzz, ...)---> DERIVATION_N

以上推导可能会产生相同的结果 应用程序,但会使用不同的配置进行构建 选项。 (请参阅APT软件包vim-noxvim-gtkvim-gtk3vim-tiny等)

为什么叫“派生”?

其名称来自“ 2.2 Nix表达式”:

  

函数[即Nix表达式]的结果   是派生。这是Nix讲的   组件构建操作派生   组件的输入。

为什么需要“商店派生”?

2.4商店衍生产品”部分具有所有 详细信息,但要点如下:

  

Nix表达式不是直接构建的。相反,它们被翻译成   商店派生的更原始的语言,它编码单个   组件构建动作。这类似于编译器的方式   通常将大部分工作放在较简单的中间   表示正在编译的代码,而不是完整的代码   语言及其所有复杂性。

商店衍生格式

来自“ 5.4。转换Nix表达式以存储派生”一节:

  

商店派生的抽象语法如图5.5所示。   类似于Haskell的[135]语法(请参见1.7节)。店铺派生   图2.13所示的示例就是此数据类型的值。

     

图5.5 .:商店派生的抽象语法

 data StoreDrv = StoreDrv {    
   output : Path,              
   outputHash : String,        
   outputHashAlgo : String,    
   inputDrvs : [Path],         
   inputSrcs : [Path],         
   system : String,            
   builder : Path,             
   args : [String],            
   envVars : [(String,String)] 
 }                             

示例

例如,用于构建Hello的Nix表达式 包在图2.6中

  

图2.6

     
{stdenv, fetchurl, perl}:

stdenv.mkDerivation {
  name = "hello-2.1.1";
  builder = ./builder.sh;
  src = fetchurl {
    url = http://ftp.gnu.org/pub/gnu/hello/hello-2.1.1.tar.gz;
    md5 = "70c9ccf9fac07f762c24f2df2290784d";
  };
  inherit perl;
}

将导致中间表示 类似于图2.13:

  

图2.13商店派生

     
{ output = "/nix/store/bwacc7a5c5n3...-hello-2.1.1" 25
, inputDrvs = { 26
    "/nix/store/7mwh9alhscz7...-bash-3.0.drv",
    "/nix/store/fi8m2vldnrxq...-hello-2.1.1.tar.gz.drv",
    "/nix/store/khllx1q519r3...-stdenv-linux.drv",
    "/nix/store/mjdfbi6dcyz7...-perl-5.8.6.drv" 27 }
  }
, inputSrcs = {"/nix/store/d74lr8jfsvdh...-builder.sh"} 28
, system = "i686-linux" 29
, builder = "/nix/store/3nca8lmpr8gg...-bash-3.0/bin/sh" 30
, args = ["-e","/nix/store/d74lr8jfsvdh...-builder.sh"] 31
, envVars = { 32
    ("builder","/nix/store/3nca8lmpr8gg...-bash-3.0/bin/sh"),
    ("name","hello-2.1.1"),
    ("out","/nix/store/bwacc7a5c5n3...-hello-2.1.1"),
    ("perl","/nix/store/h87pfv8klr4p...-perl-5.8.6"), 33
    ("src","/nix/store/h6gq0lmj9lkg...-hello-2.1.1.tar.gz"),
    ("stdenv","/nix/store/hhxbaln5n11c...-stdenv-linux"),
    ("system","i686-linux"),
    ("gtk","/store/8yzprq56x5fa...-gtk+-2.6.6"),
  }
}
     

商店派生的抽象语法如图5.5所示。   类似于Haskell的[135]语法(请参见1.7节)。店铺派生   图2.13所示的示例就是此数据类型的值。

     

图5.5 .:商店派生的抽象语法

 data StoreDrv = StoreDrv {    
   output : Path,              
   outputHash : String,        
   outputHashAlgo : String,    
   inputDrvs : [Path],         
   inputSrcs : [Path],         
   system : String,            
   builder : Path,             
   args : [String],            
   envVars : [(String,String)] 
 }                             
相关问题