Что такое выражение Nix в отношении управления пакетами Nix? - PullRequest
3 голосов
/ 05 октября 2019

Даже после прочтения руководств по Nix все еще не понимают, что на самом деле представляют собой выражения Nix. Иногда они упоминаются как деривации, но деривации в магазине также означают что-то еще.

Ответы [ 2 ]

3 голосов
/ 05 октября 2019

В Nix выражение Nix - это просто общий термин для любого типа значения, которое вы можете написать на языке Nix. Выражение Nix может быть множеством, списком, числом, строкой, функцией, именем, арифметической операцией, вызовом функции и многим другим.

Выражения Nix могут содержать другие выражения Nix: дляНапример, выражение 1 + 2 содержит в себе два выражения: 1 и 2.

Людям часто нравится писать сложные выражения 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.)

2 голосов
/ 05 октября 2019

A Выражение Nix - это набор инструкций, описывающих, как создавать программный компонент (пакет, проект, приложение и т. Д.), Используя чисто функциональный язык Nix.

Цитируя Габриэля Гонсалеса : " Вы можете думать о деривации как о не зависящем от языка рецепте того, как создать что-то (например, пакет на 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 состоит в том, чтобысоздать хранилище деривации , которое можно встроить в компонент (исполняемый файл, библиотека и т. д.).

Для контекста:

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 , раздел "2.4 Магазин дериваций".

Extra

Нормальная форма выражения Nix

Согласно разделу «5.4 Перевод выражений Nix для сохранения производныхtions "в Докторская диссертация Eelco Dolstra :

Нормальная форма [выражения Nix] должна быть

  • вызовом derivation или

  • вложенная структура списков и наборов атрибутов, которые содержат вызовы derivation.

В любом случае эти деривацииВпоследствии выражения Nix переводятся в производные хранилища.

Что такое программный компонент?

Пакет, приложение, среда разработки, библиотека программного обеспечения и т. Д.

Подробнееформально из "3.1 Что такое компонент?"в Докторская диссертация Eelco Dolstra :

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

(Весь этот раздел стоит прочитать.)

...