配置简介
介绍配置文件、配置目录、环境变量与合并策略。
常规设置与配置分区
项目配置中的每个顶层键要么是常规设置,要么是配置分区。
常规设置是单个值,例如 baseURL 或 title。配置分区则把相关的嵌套设置归为一组,例如 markup、menus 或 params。
baseURL = 'https://example.org/'
title = 'My New Hugo Site'
[params]
subtitle = 'The Best Widgets on Earth'上例中,baseURL 与 title 是常规设置,params 是配置分区。
合理的默认值
Hugo 提供了大量配置项,但默认值通常已经够用。一个新项目只需要以下设置:
baseURL = 'https://example.org/'
locale = 'en-us'
title = 'My New Hugo Site'只定义与默认值不同的设置。配置文件越小,越容易阅读、理解和调试,请保持配置简洁。
最好的配置文件就是一份简短的配置文件。
配置文件
在项目根目录创建项目配置文件,命名为 hugo.toml、hugo.yaml 或 hugo.json,优先级也按此顺序。
my-project/
└── hugo.toml一个简单的例子:
baseURL = 'https://example.org/'
locale = 'en-us'
title = 'ABC Widgets, Inc.'
[params]
subtitle = 'The Best Widgets on Earth'
[params.contact]
email = 'info@example.org'
phone = '+1 202-555-1212'构建时若想使用其他配置文件,请使用 --config 选项:
hugo build --config other.toml也可以把两个或多个配置文件组合起来,优先级从左到右:
hugo build --config a.toml,b.yaml,c.jsonHugo 按列出的顺序加载文件,后一个文件会递归覆盖前面文件中同名的键。也就是说,遇到冲突的键时,最后列出的文件的值生效。
各文件格式的规范参见 TOML、YAML 与 JSON 的官方文档。
配置目录
除了单一的项目配置文件,还可以按环境、配置分区和语言把配置拆分开。Hugo 先加载 _default 目录,再加载当前环境对应的目录,因此冲突的键以环境专属值为准。例如:
my-project/
└── config/
├── _default/
│ ├── hugo.toml
│ ├── menus.en.toml
│ ├── menus.de.toml
│ └── params.toml
└── production/
└── params.toml配置分区包括 build、caches、contentTypes、deployment、frontmatter、httpCache、imaging、languages、markup、mediaTypes、menus、minify、module、outputFormats、outputs、pagination、params、permalinks、privacy、related、security、segments、server、services、sitemap、taxonomies 等。
省略或包含分区名
Hugo 0.162.0 及更高版本支持在按配置分区拆分配置时,选择省略或包含分区名。例如下面两种写法是等价的:
# config/_default/hugo.toml
[params]
foo = 'bar'# config/_default/params.toml
foo = 'bar'这也适用于值是「切片映射」的键,例如 menus。例如下面两种写法等价:
# config/_default/menus.toml
[[main]]
name = 'Home'
pageRef = '/'
weight = 10# config/_default/menus.toml
[[menus.main]]
name = 'Home'
pageRef = '/'
weight = 10而对于 cascade、permalinks 这类纯切片类型的键,则必须写出分区名:
# config/_default/cascade.toml
[[cascade]]
[cascade.params]
color = 'red'
[cascade.target]
path = '/articles/**'只有当分区名是文件中的唯一键、且与文件基本名匹配时,Hugo 才会把它解包。
递归解析
Hugo 会递归解析 config 目录,因此你可以用子目录组织文件:
my-project/
└── config/
└── _default/
├── navigation/
│ ├── menus.de.toml
│ └── menus.en.toml
└── hugo.toml示例
my-project/
└── config/
├── _default/
│ ├── hugo.toml
│ ├── menus.en.toml
│ ├── menus.de.toml
│ └── params.toml
├── production/
│ ├── hugo.toml
│ └── params.toml
└── staging/
├── hugo.toml
└── params.toml针对上面的结构,运行 hugo build --environment staging 时,Hugo 会先采用 config/_default 中的全部设置,再用 staging 中的设置覆盖同名键。
举个具体例子。假设网站使用 Google Analytics,需要在项目配置中指定 Google 标记 ID:
[services.googleAnalytics]
ID = 'G-XXXXXXXXX'现在考虑以下需求:
- 运行
hugo server时不加载统计代码。 - 生产与预发环境使用不同的 Google 标记 ID,例如生产用
G-PPPPPPPPP,预发用G-SSSSSSSSS。
可以这样配置:
config/_default/hugo.toml- 不写
services.googleAnalytics分区,这样运行hugo server时就不会加载统计代码。 - 运行
hugo server时 Hugo 默认把environment设为development;由于不存在config/development目录,Hugo 使用config/_default目录。
- 不写
config/production/hugo.toml-
只包含以下分区:
[services.googleAnalytics] ID = 'G-PPPPPPPPP' -
无需在文件中写其他参数,只写生产环境专属的参数即可,Hugo 会用它们覆盖默认配置。
-
运行
hugo build时 Hugo 默认把environment设为production,统计代码使用G-PPPPPPPPP。
-
config/staging/hugo.toml-
只包含以下分区:
[services.googleAnalytics] ID = 'G-SSSSSSSSS' -
同样只写预发环境专属的参数。
-
运行
hugo build --environment staging构建预发站点,统计代码使用G-SSSSSSSSS。
-
合并配置设置
Hugo 会合并来自主题和模块的配置设置,并优先采用项目自身的设置。这与用 --config 组合多个配置文件、或把配置拆分到配置目录不同:后两者总是覆盖同名键。给定下面这个包含两个主题的简化项目结构:
project/
├── themes/
│ ├── theme-a/
│ │ └── hugo.toml
│ └── theme-b/
│ └── hugo.toml
└── hugo.toml以及这样的项目级配置:
baseURL = 'https://example.org/'
locale = 'en-us'
title = 'My New Hugo Site'
theme = ['theme-a','theme-b']Hugo 按以下顺序合并设置:
- 项目配置(项目根目录下的
hugo.toml) theme-a的配置theme-b的配置
合并策略
每个配置分区内的 _merge 设置决定合并哪些设置以及如何合并。
_merge 可以写在分区内的任意嵌套层级,而不只是顶层。合并嵌套表时,Hugo 优先使用该表自身设置的 _merge 值,否则从最近的祖先继承。例如,只修改某个 Goldmark 扩展的合并策略,而不影响 markup 分区的其余部分:
[markup.goldmark.extensions.typographer]
_merge = 'deep'_merge 的取值可以是:
none- 不合并。
shallow- 只为新键添加值。
deep- 为新键添加值,并合并已存在键的值。
你不需要像下面的默认配置那样写得那么啰嗦:上层设置好的 _merge 会被下层继承。
_merge = 'deep'
[markup]
_merge = 'deep'
[security]
_merge = 'none'根级合并策略
也可以在项目配置的根级、即任何配置分区之外设置 _merge,从而改变整个项目的合并行为:
_merge = 'none'
baseURL = 'https://example.org/'
locale = 'en-us'
title = 'My New Hugo Site'
theme = ['theme-a','theme-b']根级 _merge 设为 none 会完全禁用主题与模块配置的合并,无论各个配置分区上设置了什么 _merge 值;根级 _merge 设为 shallow 或 deep 则会改变那些未自行指定 _merge 的配置分区的默认合并策略。
Hugo 可以把模块和主题中的映射类型配置值合并进项目配置,但无法合并切片类型的值。这既包括
menus这类切片类型的配置分区,也包括值本身是切片的映射键,例如outputs中按页面类型划分的格式列表。
安全影响
多数配置分区默认采用 none 合并策略,正是为了保护你的项目免受第三方主题和模块影响。
把
_merge设为shallow或deep会消除这层保护,无论它是直接作用于markup、security这类安全敏感的键,还是写在配置根级以改变所有键的默认行为。只有在完全信任项目中所有主题和模块时,才为这些键使用宽松的_merge值。
环境变量
也可以用操作系统环境变量来配置:
export HUGO_BASEURL=https://example.org/
export HUGO_ENABLEGITINFO=true
hugo上面的命令设置了 baseURL 与 enableGitInfo,然后构建站点。
环境变量的优先级高于配置文件中的值。也就是说,如果同一个配置值既通过环境变量设置、又写在配置文件里,Hugo 会采用环境变量的值。
环境变量让 CI/CD 平台的配置更简单:可以直接在平台自身的配置与工作流文件中设值。
环境变量名必须以
HUGO_为前缀。要设置自定义站点参数,请用
HUGO_PARAMS_作为前缀。
对于 snake_case 形式的变量名,标准的 HUGO_ 前缀并不适用。Hugo 会根据 HUGO 之后的第一个字符推断分隔符,因此也可以写成 HUGOxPARAMSxAPI_KEY=abcdefgh,其中 x 可以是任何允许的分隔符。
除了配置常规设置,环境变量还可以覆盖某些内部设置的默认值:
DART_SASS_BINARY- (
string)Dart Sass 可执行文件的绝对路径。默认情况下,Hugo 会在PATH环境变量中的各个路径里查找该可执行文件。 HUGO_ENVIRONMENT- (
string)构建环境。运行hugo build时默认为production,运行hugo server时默认为development。 HUGO_FILE_LOG_FORMAT- (
string)报错时、或从短代码与 Markdown 渲染钩子调用Position方法时,显示文件路径、行号与列号的格式字符串。可用标记为:file、:line和:col,默认为:file::line::col。 HUGO_MEMORYLIMIT- (
int)Hugo 渲染站点时最多可使用的系统内存,单位为 GB。默认是系统总内存的 25%。注意HUGO_MEMORYLIMIT只是「尽力而为」的设置,不要指望仅用 1 GB 内存就能构建上百万个页面。想了解构建过程中的实际表现,可以运行hugo build --logLevel info,并查看dynacache标签。 HUGO_NUMWORKERMULTIPLIER- (
int)并行处理时使用的工作进程数乘数。默认是逻辑 CPU 的数量。
查看当前配置
查看完整的项目配置:
hugo config查看某一项配置:
hugo config | grep [key]查看已配置文件挂载(mounts):
hugo config mounts