Миграция сайта с Jekyll на Hugo

#jekyll #hugo

Я уже писал о том, что возникли проблемы с использованием Github Pages. Проблему удалось решить с помощью отказа от сборки Github Pages в сторону нового Github Actions. Но примерно в то же время я понял, что пришло время менять движок. Так как развитие Jekyll продолжается, вносятся новые ограничения, новые возможности. И мои статьи уже сложно каждый раз переделывать на новый лад.

Несколько раз пытался ранее перейти на другие движки, и на Hugo, и на Gostatic, и на ряд других. Для Gostatic даже написал плагины, которые позволяют использовать файлы статей Jekyll без изменений. Но постоянно возникали определенные проблемы, которые перечеркивали все на корню. К тому же сложно решать проблемы, когда все и так работает. Работает, до недавнего времени, когда вопрос миграции стал очень острым.

В последнее время Hugo развивается очень быстро, и его используют у себя все больше блоггеров. Поэтому решил остановить свой выбор именно на нем.

Миграция файлов статей

Файлы статей незначительно, но отличаются в Jekyll и Hugo. Отличия присутствуют в заголовках файлов. К примеру, статья в Jekyll:

---
layout: post
title: "Проблема с Github Pages"
date: 2019-10-13 11:03
tags:
  - github
  - jekyll
---

И та же самая статья в Hugo:

---
title: "Проблема с Github Pages"
date: "2019-10-13T11:03:00+0300"
tags:
  - github
  - jekyll
---

Во-первых, удаляется поле layout, так как типы страниц определяются в конфигурации сайта. И во-вторых, меняется формат даты.

Первым делом попробовал использовать утилиту по миграции статей с Jekyll в Hugo, что встроена в Hugo. Результатом работы получил новую директорию со своими статьями, из которых просто удалили все заголовки. Разумеется, использовать для миграции данный метод было нельзя.

Для решения данной проблемы написал свою программу juev/jekyll2hugo, которая преобразует заголовки в статьях нужным образом. Использовать ее довольно просто, ставим и запускаем, передавая два параметра, где размещаются статьи, и где размещать результат:

$ go get github.com/juev/jekyll2hugo
$ jekyll2hugo --src ../blog/_posts/ --dst ../hugo_blog/

Таким образом в короткий срок преобразовал все свои более 300 статей в нужный формат.

Формат ссылок

Менять имена файлов статей Jekyll мне не хотелось, просто потому, что он довольно удобный и позволяет в одной директории размещать все необходимые материалы. Но при этом я получал некорректные ссылки сайта. На так давно в Hugo добавили требуемый функционал, который позволил решить проблему. Достаточно было в конфигурацию сайта добавить следующий код:

[frontmatter]
date = [":filename", ":default"]

[permalinks]
posts = "/:year/:month/:day/:slug/"

После чего дата, используемая в ссылке берется из имени файла, и slug формируется из остатка имени файла.

Формат и размещение rss ленты

С лентой RSS пришлось повозиться. По умолчанию все ленты на сайте формируются в корне определенных директорий и имеют имя index.xml. У меня же на сайте давно уже использовалась лента, размещаемая по ссылке https://www.juev.org/atom.xml. Потратил несколько часов времени чтобы найти решение.

Для того, чтобы изменить имя основного файла, в конфигурацию сайта достаточно добавить следующий код:

[outputs]
home = ["HTML", "AMP", "RSS"]
page = ["HTML", "AMP"]

[mediaTypes]
[mediaTypes."application/rss"]
suffixes = ["xml"]

[outputFormats]
[outputFormats.RSS]
mediatype = "application/rss"
baseName = "atom"

Второй проблемой было то, что у меня использовался кастомный фид, то есть в него добавляется определенный текст, со ссылками на мой сайт. И использовать стандартный уже не очень хотелось. Но как оказалось, это уже было меньшей проблемой, достаточно было создать шаблон для ленты, включив требуемые элементы. Полный текст шаблона приводить не буду, найти его можно на Github: layouts/index.xml.

Тема оформления

Изначально думал разместить тему своего сайта отдельно, в виде темы, которая импортируется при сборке. Но в результате решил отказаться от этой идеи и просто разместить нужные файлы в структуре сайта. Пришлось потратить немного времени на то, чтобы переписать шаблоны в нужный формат. Затем даже несколько расширил возможности сайта, добавив в заголовки сайта дополнительные теги.

И результат можно увидеть в директории layouts исходного кода сайта. Единственно, снова изменились страницы с тегами. Теперь это не одна страница, а множество, под каждый тег отдельно, и одна страница со списком имеющихся тегов.

Сборка сайта

Для сборки сайта используется так же Github Actions: .github/workflows/gh-pages.yml

Несмотря на то, что Hugo собирает сайт мгновенно, на сборку в условиях Github уходит почти минута времени, а все из-за того, что во-первых, сборка запускается не сразу после комита, а лишь спустя определенное время. Во-вторых, требуется подготовить окружение для запуска сборки. И затем сам деплой занимает определенное время. В результате время сборки Jekyll сайта мало чем отличается от времени сборки Hugo сайта.

vim-hugo

Так как у меня используются нестандартные имена файлов, создавать новые статьи с помощью hugo new уже не удастся. Создал новый плагин для vim, который упрощает создание статей в Hugo: juev/vim-hugo.

Установить просто, к примеру при использовании vim-plug, нужно лишь добавить следующие строки в свой vimrc файл:

Plug 'juev/vim-hugo'
let g:hugo_path = "~/Projects/juev.org"

И установить командой PlugInstall. Вторая строка конфигурации определяет где именно размещается сайт в файловой системе.

Для создания новой статьи достаточно в запущенном vim дать команду: :HugoPost, после чего задать имя статьи и можно писать. Будет создан новый файл в требуемом месте, с нужным именем и с заполненными заголовками. Файл сразу же открывается в vim на редактирование.

Заключение

В чем профит, спросите вы? Выгода от проведенной миграции в том, что теперь очень сильно упростилась локальная разработка сайта. Мне не нужно после переустановки операционной системы устанавливать ruby/bundle и затем инициализировать весь список зависимостей для того, чтобы собрать сайт. Теперь достаточно скачать бинарный файл Hugo под требуемую операционную систему и запустить его. На этом все! Да, теперь у меня так же появляется возможность работать на сторонних компьютерах без каких либо проблем.

Время сборки/публикации почти не изменилось, но при этом я теперь имею возможность прибить гвоздями версию Hugo, и использовать ее столько времени, сколько потребуется. И ничто не сломает сборку, как это уже происходило у меня в случае с Jekyll.