Какова цель nix-instantiate? Что такое магазин-деривация?

В руководстве написано:

Команда nix-instantiate генерирует производные магазина от (высокоуровневые) выражения Nix.

Но что такое деривация в магазине?

В руководстве говорится о деривациях магазинов :

Описание действия по сборке. Результатом деривации является магазин объект. Производные обычно указываются в выражениях Nix с использованием примитив образования. Они переведены в магазин низкого уровня деривации (неявно nix-env и nix-build, или явно nix-instantiate)

Это немного трудно понять для nix-newbee, и я не нашел ничего более поучительного в nix-instantiate и хранить деривации путем поиска в Google. Я также спросил о #nixos, пока не получил ответа.

Может кто-нибудь объяснить на простом примере, что такое деривация магазина, для чего он используется?

Зачем генерировать деривации из магазина, используя nix-instantiate Не могли бы вы привести супер простой, легкий для понимания пример?

Ответ 1

  Чем хорош nix-instantiate?

Единственная цель команды nix-instantiate - оценить выражения Nix. Основная цель языков Nix - генерировать деривации.

Что такое магазин-деривация?

Деривация (см. Пример) - это дружественное к компьютеру представление рецептов сборки, используемых для сборки (реализации) пакетов. Это файлы с расширением .drv, которые перечислены в каталоге магазина, обычно /nix/store.

Эти рецепты сборки понятны демону Nix и используются для обеспечения того, чтобы все зависимости были построены ранее и сохранены в предварительно вычисленных путях. Как только все зависимости успешно скомпилированы, демон Nix может искать замену или реализовывать вывод локально. Все подробное объяснение доступно в докторской диссертации Eelco Dolstra.

Эти файлы создаются каждый раз, когда команда nix-instantiate оценивает функцию derivation языка Nix, если не указана опция командной строки --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)

Ответ 2

All quotes are from Eelco Dolstra PhD thesis.

Магазин дериваций

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

"Nix expressions usually translate to a graph of store derivations."

Другими словами,

*------------------------------------------------------*
|                                                      |
| 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. Image taken from section "2.4 Store derivations".


тезис описывает выражение Nix как "Семейство строительных действий", в отличие от деривация, которая является "точно одним действием сборки".

                              ARG_1, ..., ARG_N

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

Приведенные выше производные могут производить то же самое приложение, но построит его с другой конфигурацией варианты например. (См. пакеты APT vim-nox, vim-gtk, vim-gtk3, vim-tiny и т.д.)

Почему это называется "деривация"?

Его название происходит от "2.2 выражений 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)] 
 }                             
Пример

Example

Например, выражение Nix для построения Hello пакет на рисунке 2.6,

Figure 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)] 
 }