<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Frontmatter on dedinit()</title><link>https://dedinit.ru/tags/frontmatter/</link><description>Recent content in Frontmatter on dedinit()</description><generator>Hugo -- 0.165.0</generator><language>ru-ru</language><lastBuildDate>Sat, 18 Apr 2026 09:44:39 +0300</lastBuildDate><atom:link href="https://dedinit.ru/tags/frontmatter/index.xml" rel="self" type="application/rss+xml"/><item><title>Как автоматизировать создание постов в Hugo: slugs, архетипы и бандлы</title><link>https://dedinit.ru/2026/hugo-slugs-archetypes-bundles/</link><pubDate>Sat, 18 Apr 2026 09:44:39 +0300</pubDate><guid>https://dedinit.ru/2026/hugo-slugs-archetypes-bundles/</guid><description>Настраиваем Hugo так, чтобы не копировать index.md вручную, не мучиться с транслитерацией и получать красивые URL с датами</description><content:encoded><![CDATA[<figure class="entry-cover"><img src="https://dedinit.ru/2026/hugo-slugs-archetypes-bundles/hero.svg" alt="Автоматизация Hugo"></figure><h2 id="проблема-рутина-при-создании-постов">Проблема: рутина при создании постов</h2>
<p>Когда я только начинал вести блог на Hugo, каждый новый пост создавался через боль и страдания:</p>
<ol>
<li>Создать папку вручную <code>content/posts/название-поста/</code></li>
<li>Скопировать туда <code>index.md</code> из соседней папки</li>
<li>Отредактировать front matter (дату, заголовок, теги)</li>
<li>Придумать slug для красивого URL</li>
<li>&hellip;и не забыть, что папку лучше назвать на латинице</li>
</ol>
<p>На всё это уходило пара минут чисто механической работы. А когда постов 10–20, это начинает реально бесить.</p>
<p>В этой статье я расскажу, как я решил эту проблему с помощью штатных возможностей Hugo: <strong>архетипов (archetypes)</strong>, <strong>пермалинков (permalinks)</strong> и правильной организации <strong>бандлов (bundles)</strong>.</p>
<h2 id="что-такое-бандл-и-зачем-папка-для-каждого-поста">Что такое бандл и зачем папка для каждого поста</h2>
<p>Hugo поддерживает три типа контента:</p>
<p>Три способа хранения контента в Hugo</p>
<ol>
<li>Простой файл .md (без папки)</li>
</ol>
<p>Самый простой способ — просто положить файл мой-пост.md в папку content/posts/:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>content/
</span></span><span style="display:flex;"><span>└── posts/
</span></span><span style="display:flex;"><span>    ├── первый-пост.md
</span></span><span style="display:flex;"><span>    ├── второй-пост.md
</span></span><span style="display:flex;"><span>    └── третий-пост.md
</span></span></code></pre></td></tr></table>
</div>
</div><p>Плюсы:</p>
<ul>
<li>Максимально просто, ничего создавать не нужно</li>
<li>Подходит для простых постов без изображений</li>
</ul>
<p>Минусы:</p>
<ul>
<li>Все изображения нужно класть в общую папку static/images/</li>
<li>Нельзя прикрепить к посту специфичные файлы (PDF, архивы и т.д.)</li>
<li>Изображения нужно называть уникально, чтобы не пересекались с другими постами</li>
</ul>
<ol start="2">
<li>Leaf bundle (папка + index.md)</li>
</ol>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">6
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>content/
</span></span><span style="display:flex;"><span>└── posts/
</span></span><span style="display:flex;"><span>    └── мой-пост/
</span></span><span style="display:flex;"><span>        ├── index.md
</span></span><span style="display:flex;"><span>        ├── hero.jpg
</span></span><span style="display:flex;"><span>        └── code-example.py
</span></span></code></pre></td></tr></table>
</div>
</div><p>Плюсы:</p>
<ul>
<li>Все ресурсы поста в одном месте</li>
<li>Можно ссылаться на изображения относительно: <img loading="lazy" src="hero.jpg" alt="герой"  />
</li>
<li>Не нужно думать об уникальности имён файлов</li>
</ul>
<p>Минусы:</p>
<ul>
<li>Нужно создавать папку (но мы это автоматизировали)</li>
</ul>
<ol start="3">
<li>Branch bundle (папка + _index.md)</li>
</ol>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">6
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>content/
</span></span><span style="display:flex;"><span>├── posts/
</span></span><span style="display:flex;"><span>│   ├── _index.md          &lt;- описывает секцию /posts/
</span></span><span style="display:flex;"><span>│   ├── первый-пост.md
</span></span><span style="display:flex;"><span>│   └── мой-пост/
</span></span><span style="display:flex;"><span>│       └── index.md
</span></span></code></pre></td></tr></table>
</div>
</div><p>Плюсы:</p>
<ul>
<li>_index.md позволяет задать заголовок, описание для всей секции</li>
<li>Можно настроить отдельный шаблон для списка постов</li>
</ul>
<p>Структура моего блога:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">9
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>content/
</span></span><span style="display:flex;"><span>├── posts/
</span></span><span style="display:flex;"><span>│ ├── hugo-slugs-archetypes-bundles/
</span></span><span style="display:flex;"><span>│ │ ├── index.md
</span></span><span style="display:flex;"><span>│ │ ├── images/
</span></span><span style="display:flex;"><span>│ │ │ └── diagram.png
</span></span><span style="display:flex;"><span>│ │ └── code-example.txt
</span></span><span style="display:flex;"><span>│ └── другой-пост/
</span></span><span style="display:flex;"><span>│ └── index.md
</span></span></code></pre></td></tr></table>
</div>
</div><p>Плюсы такого подхода:</p>
<ul>
<li>Все посты хранятся одинаково — папка + index.md. Не нужно думать, какой способ выбрать.</li>
<li>Все файлы поста в одном месте</li>
<li>Можно удобно ссылаться на изображения: <code>![схема](images/diagram.png)</code></li>
<li>Не нужно придумывать уникальные имена для картинок глобально</li>
<li>Если я захочу экспортировать пост в другой блог, достаточно скопировать одну папку со всеми ресурсами.</li>
</ul>
<h2 id="почему-папку-бандла-нужно-называть-на-латинице">Почему папку бандла нужно называть на латинице</h2>
<p>Здесь кроется важный момент. Hugo позволяет использовать любые символы в именах папок, включая кириллицу. Но есть <strong>две причины использовать латиницу</strong>:</p>
<ol>
<li><strong>Чистые URL.</strong> Если папка называется <code>мой-пост</code>, то URL будет <code>/%D0%BC%D0%BE%D0%B9-%D0%BF%D0%BE%D1%81%D1%82/</code>. Браузер это поймёт, но выглядит ужасно.</li>
<li><strong>Slug без транслитерации.</strong> Имя папки удобно использовать как <code>slug</code> — последний сегмент URL. А латиница в URL — это стандарт и хороший тон.</li>
</ol>
<p><strong>Правило:</strong> папку называем на латинице (например, <code>my-awesome-post</code>), а заголовок внутри пишем по-русски.</p>
<h2 id="как-автоматизировать-создание-бандла-через-консоль">Как автоматизировать создание бандла через консоль</h2>
<p>Команда для создания бандла с одной папкой:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>hugo new content posts/название-папки/index.md
</span></span></code></pre></td></tr></table>
</div>
</div><p>Hugo сам создаст папку, сгенерирует index.md с front matter из архетипа.</p>
<p>Важно: эта команда появилась в Hugo 0.112. В старых версиях нужно было сначала создать папку, потом файл.</p>
<h2 id="настройка-архетипа-archetype">Настройка архетипа (archetype)</h2>
<p>Архетип — это шаблон для новых файлов. Он лежит в archetypes/default.md (или в archetypes/post-bundle.md для конкретного типа).</p>
<p>Мой архетип выглядит так (TOML-формат):</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">17
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>date = <span style="color:#a5d6ff">&#39;{{ .Date }}&#39;</span>
</span></span><span style="display:flex;"><span>lastmod = <span style="color:#a5d6ff">&#39;{{ .Date }}&#39;</span>
</span></span><span style="display:flex;"><span>draft = <span style="color:#79c0ff">true</span>
</span></span><span style="display:flex;"><span>title = <span style="color:#a5d6ff">&#39;{{ replace .File.ContentBaseName &#34;-&#34; &#34; &#34; | title }}&#39;</span>
</span></span><span style="display:flex;"><span>slug = <span style="color:#a5d6ff">&#39;{{ .File.ContentBaseName }}&#39;</span>
</span></span><span style="display:flex;"><span>description = <span style="color:#a5d6ff">&#39;&#39;</span>
</span></span><span style="display:flex;"><span>author = <span style="color:#a5d6ff">&#39;Кразя&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>categories = [
</span></span><span style="display:flex;"><span>  <span style="color:#a5d6ff">&#39;uncategorized&#39;</span>
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>tags = [
</span></span><span style="display:flex;"><span>  <span style="color:#a5d6ff">&#39;draft&#39;</span>
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></td></tr></table>
</div>
</div><p>Разберём ключевые моменты:
Поле Значение
title Берёт имя папки, заменяет дефисы на пробелы и делает заглавные буквы. my-awesome-post → My Awesome Post
slug Просто берёт имя папки как есть: my-awesome-post
.File.ContentBaseName Встроенная переменная Hugo — имя текущей папки без расширения и пути</p>
<p>После создания поста я вручную меняю title на русский и заполняю description, categories, tags.</p>
<h2 id="настройка-permalinks-для-красивых-url">Настройка permalinks для красивых URL</h2>
<p>Чтобы URL выглядел как 2025/03/my-awesome-post/, а не как posts/my-awesome-post/, добавляем в hugo.toml:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[permalinks]
</span></span><span style="display:flex;"><span>  posts = <span style="color:#a5d6ff">&#34;/:year/:month/:slug/&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Теперь при сборке сайта Hugo сам построит нужную структуру. При этом внутри content/ всё остаётся по-прежнему — папка в posts/.</p>
<h2 id="полный-цикл-создания-поста-без-лишних-телодвижений">Полный цикл создания поста (без лишних телодвижений)</h2>
<p>Вот как теперь выглядит создание нового поста в моём блоге:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">12
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 1. Создаём бандл с латинским именем папки</span>
</span></span><span style="display:flex;"><span>hugo new content posts/hugo-best-practices/index.md
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 2. Открываем файл и правим русский заголовок, описание, теги</span>
</span></span><span style="display:flex;"><span>vim content/posts/hugo-best-practices/index.md
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 3. Пишем пост в markdown</span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 4. Смотрим локально</span>
</span></span><span style="display:flex;"><span>hugo server -D
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 5. Публикуем</span>
</span></span><span style="display:flex;"><span>make deploy
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="что-ещё-можно-добавить-в-front-matter">Что ещё можно добавить в front matter</h2>
<p>В процессе настройки я выяснил, что Hugo поддерживает много полезных полей:</p>
<table>
	<thead>
			<tr>
					<th>Поле</th>
					<th>Назначение</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>publishDate</code></td>
					<td>Отложенная публикация (не рендерится до указанной даты)</td>
			</tr>
			<tr>
					<td><code>expiryDate</code></td>
					<td>Автоматическое снятие с публикации</td>
			</tr>
			<tr>
					<td><code>lastmod</code></td>
					<td>Дата последнего изменения (для SEO)</td>
			</tr>
			<tr>
					<td><code>aliases</code></td>
					<td>Редиректы со старых URL</td>
			</tr>
			<tr>
					<td><code>weight</code></td>
					<td>Ручная сортировка в списке (меньше — выше)</td>
			</tr>
			<tr>
					<td><code>images</code></td>
					<td>Изображение для Open Graph и Twitter Cards</td>
			</tr>
			<tr>
					<td><code>params</code></td>
					<td>Кастомные параметры для темы</td>
			</tr>
	</tbody>
</table>
<h2 id="итог">Итог</h2>
<p>После всех настроек создание нового поста занимает ровно столько времени, сколько нужно на написание контента. Никакой ручной возни с папками и копированием index.md.</p>
<p>Ключевые выводы:</p>
<ul>
<li>
<p>Используйте leaf bundles (папка + index.md) для хранения всех ресурсов поста в одном месте</p>
</li>
<li>
<p>Папки называйте на латинице — это даст чистые URL и автоматический slug</p>
</li>
<li>
<p>Настройте архетип с переменной {{ .File.ContentBaseName }} для автоматической генерации title и slug</p>
</li>
<li>
<p>Добавьте [permalinks] в конфиг для красивых URL с датами</p>
</li>
</ul>
<p>Создавайте новый пост одной командой: <code>bash hugo new content posts/имя-папки/index.md</code></p>
<p>Теперь можно сосредоточиться на том, ради чего всё затевалось — на содержании.</p>
<p>Если у тебя есть свои лайфхаки по Hugo или ты знаешь, как сделать транслитерацию slug прямо из заголовка — пишите мне в Telegram <a href="https://t.me/kpa39l">https://t.me/kpa39l</a>. Обсудим.</p>
]]></content:encoded></item></channel></rss>