在manual中写道:
命令nix-instantiate从中生成存储派生 (高级)Nix表达。
但什么是商店派生?
手册中说明了以下store derivations:
构建操作的描述。推导的结果是商店 宾语。通常使用Nix表达式指定派生 推导原语。这些都被翻译成了低级商店 推导(由nix-env和nix-build隐式显示,或由 尼克斯实例化)
这对于nix-newbee来说有点难以理解,我发现通过谷歌搜索没有更多关于nix-instantiate和store派生的启发。我也问#nixos,但我没有回答。
有人可以在一个简单的例子中解释一下商店的推导是什么,它用于什么?
为什么要使用nix-instantiate生成商店派生?你能给出一个超级简单易懂的例子吗?
答案 0 :(得分:24)
nix-instantiate的优点是什么?
命令nix-instantiate
唯一目的是评估Nix表达式。
Nix语言的主要目的是生成派生。
什么是商店派生?
派生(see example)是用于构建(实现)包的构建配方的计算机友好表示。它们是商店目录中列出的扩展名为.drv
的文件,通常为/nix/store
。
这些构建配方由Nix守护程序理解,用于确保所有依赖项之前构建并存储在预先计算的路径中。一旦成功编译了所有依赖项,Nix守护程序就可以查找替换,或者在本地实现派生。所有详细说明均可在Eelco Dolstra PhD Thesis中找到。
每次nix-instantiate命令评估Nix语言的derivation
函数时,都会创建这些文件,除非提供了--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)
答案 1 :(得分:2)
所有引号均来自Eelco Dolstra's PhD thesis。
商店派生是Nix expression,所有 删除可变性,并 翻译 为其他格式。 此中间表示“ 描述一个 可以将 内置到软件组件中的单一,静态,持续的构建操作”。
“ 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 |
| |
| ( Call a Nix expression with concrete arguments. ) |
| ( Corollary: a single Nix expression can produce ) |
| ( different derivations depending on the inputs. ) |
| |
*------------------------------------------------------*
对于上下文:
thesis将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表达式]的结果 是派生。这是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)]
}
例如,用于构建Hello
的Nix表达式
包在图2.6中
图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)]
}