From 3b2e0017629213971b70473819252113a0fa57f6 Mon Sep 17 00:00:00 2001 From: OpenTritium Date: Wed, 18 Oct 2023 11:16:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E6=A8=A1=E5=9D=97=E6=B1=82?= =?UTF-8?q?=E5=80=BC=E9=83=A8=E5=88=86=E5=AF=B9=E9=85=8D=E7=BD=AE=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=9A=84=E6=8F=8F=E8=BF=B0=EF=BC=8C=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=8F=92=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/.vuepress/public/images/Module/ModulesEval.svg | 3 +++ src/tutorials/module/README.md | 10 +++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 src/.vuepress/public/images/Module/ModulesEval.svg diff --git a/src/.vuepress/public/images/Module/ModulesEval.svg b/src/.vuepress/public/images/Module/ModulesEval.svg new file mode 100644 index 0000000..4e20226 --- /dev/null +++ b/src/.vuepress/public/images/Module/ModulesEval.svg @@ -0,0 +1,3 @@ + + +
模块集合
模块集合
options
options
config
config
提取 options 声明
提取 options 声明
求值所有 options 的最终值
求值所有 options 的最终值
输入各模块触发配置动作
输入各模块触发配置动作
将 options 输入定义部分
将 options 输入定义部分
Text is not SVG - cannot display
\ No newline at end of file diff --git a/src/tutorials/module/README.md b/src/tutorials/module/README.md index 93c5089..367b63f 100644 --- a/src/tutorials/module/README.md +++ b/src/tutorials/module/README.md @@ -4,7 +4,7 @@ NixOS 的配置文件是通过一个个可复用的模块实现的,我们之 ## 模块的工作原理 -一个成熟的模块大概由三个部分组成:导入(imports)、选项(options)与配置(config)。下面是个简单的示例,请你将这三部分单独看待: +一个成熟的模块大概由三个部分组成:导入(imports)、选项(options)与配置(config,或者叫做定义)。下面是个简单的示例,请你将这三部分单独看待: ```nix { @@ -58,14 +58,16 @@ NixOS 的配置文件是通过一个个可复用的模块实现的,我们之 这些工具函数可以在[函数库](https://nixos-cn.org/tutorials/lang/Utils.html)查询到。 ::: -好的,现在我们办成了两件事,声明选项,以及定义了启用选项后会触发的动作。不知道你是否足够细心?注意到 `mkIf` 后面是 `config.myModule.enable`,即它是从 `config` 输入来的,我们不是在上面声明过了吗?为什么不直接通过 `options.myModule.enable` 来求值呢?直接去求值 `options.myModule.enable` 是没有意义的,因为这个选项是未经设置的,这只会求值出它的默认值。接下来就是 `imports` 的作用了,我们通过将一个模块导入到另一个模块,从而设置(定义)被包含的模块的 `options`。 +好的,现在我们办成了两件事,声明选项,以及定义了启用选项后会触发的动作。不知道你是否足够细心?注意到 `mkIf` 后面是 `config.myModule.enable`,即它是从参数 `config` 输入来的,我们不是在 `options` 里声明过这个选项了吗?为什么不直接通过 `options.myModule.enable` 来求值呢? + +直接去求值 `options.myModule.enable` 是没有意义的,因为这个选项是未经设置的,这只会求值出它的默认值。接下来就是 `imports` 的作用了,我们通过将一个模块导入到另一个模块,从而在其他模块设置(定义)被包含的模块的 `options`。 ==被包含的模块只有 `options` 是对外部可见的==,里面定义的函数与常量都是在本地作用域定义的,对其他文件不可见。同时,被 `imports` 组织的模块集合中的任意模块都能访问任意模块的 `options`,也就是说,只要是被 `imports` 组织的模块,其 `options` 是全局可见的。 接下来构建系统会提取你所有模块中的 `options`,然后求值所有模块中对 `options` 的定义: ::: tip -如果一个模块没有声明与配置部分,就直接开始定义部分。 +如果一个模块没有任何声明,就直接开始定义(`config`)部分。注意不需要使用 `config = {}` 包装,因为这个模块不包含任何声明,只有定义。你可以将这里的定义理解为一种无条件配置,因为我们没有使用 `mkIf` 之类的函数。 ::: ```nix @@ -77,6 +79,8 @@ NixOS 的配置文件是通过一个个可复用的模块实现的,我们之 } ``` +![求值过程](/images/Module/ModulesEval.svg) + 然后构建系统再将所有的配置项(即被定义后的 `options`)求值,然后作为参数 `config` 输入到每个模块,这就是每个模块通常要在第一行输入 `config` 的原因,然后下面的 `config` 会根据最终值触发一系列配置动作,从而达到求值模块以生成系统目的。 ## 模块的常见输入