16

マニュアルには次のように書かれています。

このコマンドnix-instantiateは、(高レベルの) Nix 式からストアの派生を生成します。

しかし、ストア派生とは何ですか?

マニュアルには、ストアの派生について次のように記載されています。

ビルド アクションの説明。派生の結果はストア オブジェクトです。派生は通常、派生プリミティブを使用して Nix 式で指定されます。これらは、低レベルのストアの派生に変換されます ( と によって暗黙的にnix-envnix-buildまたは によって明示的に nix-instantiate) 。

これは nix-newbee にとって理解するのが少し難しく、nix-instantiateグーグルで派生物を保存することについてこれ以上啓発的なものは何も見つかりませんでした。#nixos でも質問しましたが、まだ回答がありません。

ストアの派生とは何か、何に使用されるのか、簡単な例で説明してもらえますか?

を使用してストア派生を生成するのはなぜnix-instantiateですか? 非常にシンプルでわかりやすい例を教えてください。

4

2 に答える 2

6

すべての引用はEelco Dolstra の博士論文からのものです。

ストア派生

ストアの 派生 は、 すべての可変性が削除さ れ、代替形式に変換されたNix 式です。この中間表現は、「ソフトウェア コンポーネントに組み込むことができる、単一の静的で一定のビルド アクションを記述します」 。

" 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             |
|                                                      |
| ( Result of a Nix expression called with concrete arguments. ) |
| ( Corollary: a single Nix  expression  can produce ) |
| ( different derivations depending on the inputs.   ) |
|                                                      |
*------------------------------------------------------*

コンテキスト:

Nix 式の 2 段階の構築。 nix-instantiate は Nix 式をストア派生に変換し、nix-store --realize は派生をソフトウェア コンポーネントにビルドします。 セクション「2.4 ストアの派生」から取得した画像。


この論文では、Nix 式を「ビルド アクションのファミリー」として説明しており、派生が「 1 つのビルド アクション」であるのとは対照的です。

                              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 式] の結果は derivationです。 これは、入力からコンポーネントを 派生させるコンポーネント ビルド アクションの Nix 用語 です。

なぜ「ストア派生」が必要なのですか?

セクション「2.4 Store derivations」にすべての詳細がありますが、要点は次のとおりです。

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 図 2.6 のパッケージをビルドする Nix 式は、

図 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)] 
 }                             
于 2019-10-04T21:51:06.927 に答える