关于Nix软件包管理的Nix表达是什么?

时间:2019-10-04 21:53:20

标签: nix

即使阅读了Nix手册,它仍然使Nix表达式的真正含义感到困惑。有时它们被称为派生,但是商店派生也意味着其他。

2 个答案:

答案 0 :(得分:3)

在Nix中, Nix表达式只是可以用Nix语言编写的任何类型的值的通用术语。 Nix表达式可以是集合,列表,数字,字符串,函数,名称,算术运算,函数调用等。

Nix表达式可以包含其他Nix表达式:例如,表达式1 + 2包含两个表达式:12

人们经常喜欢编写复杂的Nix表达式,这些表达式表示如何构建软件。这些表达式实际上只是带有一些特殊属性的集合。 Nix软件可以评估这样的表达式,然后将其转换为.drv文件(这是描述如何构建某些软件的非常简单,紧凑的方式),然后可以对其进行构建。

您可以使用Nix语言和Nix表达式执行许多不涉及派生或构建软件的事情。 nix eval命令可让您评估Nix表达式。运行nix eval --help以查看其帮助屏幕,或运行以下命令以评估一些简单的表达式:

nix eval '(1 + 2)'  # gives 3

nix eval '({ a = 1; b = 2; }.a)'  # gives 1

(由于某种原因,此命令似乎要求在它所评估的大多数Nix表达式周围加上括号,但这似乎是一个错误或奇怪的设计选择,并且括号并不是每个Nix表达式必​​不可少的部分)

答案 1 :(得分:1)

Nix表达式是一组说明 描述如何构建软件组件 (包,项目,应用程序等)使用Nix 纯粹的功能语言。

To quote Gabriel Gonzalez: “ 您可以将推导视为 与语言无关的配方 (例如Haskell软件包)。


Nix表达式也通常称为 派生(如 Nix派生 表达式),但

*------------------------------------------------------*
|                                                      |
|       STORE DERIVATION =/= NIX EXPRESSION            |
|                                                      |
*------------------------------------------------------*
|                                                      |
| 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.   ) |
|                                                      |
*------------------------------------------------------*

Nix表达式的目的是产生一个 store derivation 可以内置到组件(可执行文件, 库等)。

对于上下文:

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.

Eelco Dolstra's PhD thesis的“ 2.4存储派生”部分中获取的图像。

额外

Nix表达式的普通形式

根据“ 5.4将Nix表达式转换为 存储派生”中的Eelco Dolstra's PhD thesis

  

[Nix表达式]的范式应该   是

     
      
  • 调用derivation,或

  •   
  • 列表和列表的嵌套结构   包含调用的属性集   到derivation

  •   
     

无论如何,这些推导Nix表达式   随后将其翻译为存储衍生产品。

什么是软件组件?

软件包,应用程序,开发环境, 软件库等。

从“ 3.1什么是组件?”更正式地在Eelco Dolstra's PhD thesis中:

A software component is                      

    *-------------------------------------*
1.  | a software artifact that is subject |
    | to automatic composition            |
    *-------------------------------------*

    It can require, and be required by,   
    other components.                     

    *----------------------*              
2.  | a unit of deployment |              
    *----------------------*    

(整个部分值得阅读。)