Skip to content

Commit

Permalink
更正模块求值部分对配置部分的描述,补充插图
Browse files Browse the repository at this point in the history
  • Loading branch information
OpenTritium committed Oct 18, 2023
1 parent eacec6d commit 3b2e001
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 3 deletions.
3 changes: 3 additions & 0 deletions src/.vuepress/public/images/Module/ModulesEval.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 7 additions & 3 deletions src/tutorials/module/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ NixOS 的配置文件是通过一个个可复用的模块实现的,我们之

## 模块的工作原理

一个成熟的模块大概由三个部分组成:导入(imports)、选项(options)与配置(config)。下面是个简单的示例,请你将这三部分单独看待:
一个成熟的模块大概由三个部分组成:导入(imports)、选项(options)与配置(config,或者叫做定义)。下面是个简单的示例,请你将这三部分单独看待:

```nix
{
Expand Down Expand Up @@ -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
Expand All @@ -77,6 +79,8 @@ NixOS 的配置文件是通过一个个可复用的模块实现的,我们之
}
```

![求值过程](/images/Module/ModulesEval.svg)

然后构建系统再将所有的配置项(即被定义后的 `options`)求值,然后作为参数 `config` 输入到每个模块,这就是每个模块通常要在第一行输入 `config` 的原因,然后下面的 `config` 会根据最终值触发一系列配置动作,从而达到求值模块以生成系统目的。

## 模块的常见输入
Expand Down

0 comments on commit 3b2e001

Please sign in to comment.