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

问题描述 投票:1回答:2

即使阅读了Nix手册,它仍然使Nix的表达真正混淆。有时它们被称为派生,但商店派生也意味着其他。

nix
2个回答
2
投票

在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
投票

A 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 |              
    *----------------------*    

(整个部分值得一读。)

© www.soinside.com 2019 - 2024. All rights reserved.