2025, Oct 21 01:16
Как исправить TypeError в Pelican из‑за изменений в minify-html
Pelican падает при сборке с TypeError из‑за minify-html. Объясняем причину в 0.16.0 и даем правку вызова minify с новыми параметрами для стабильной сборки.
После обновления зависимостей Pelican может внезапно падать при сборке сайта, даже если в содержимом ничего не меняли. Частый сценарий — сбой на этапе минификации с ошибкой TypeError, указывающей на неожиданные именованные аргументы. Если сборка обрывается на каком‑нибудь HTML вроде output/archives.html, а стек заканчивается сообщением про minify(), скорее всего, вы столкнулись с недавним несовместимым изменением в minify-html.
CRITICAL Exception: Unable to minify file output\archives.html. Exception was: TypeError("minify() got an unexpected keyword argument 'do_not_minify_doctype'")
Как воспроизвести сбойный вызов
В описанной ситуации причина находится в плагине минификации Pelican. Вызов minify-html использует имена аргументов, которые после несовместимого обновления больше не поддерживаются. Логика простая: прогнать HTML через minify_html.minify с флагами минификации CSS и JS, сохранив doctype и пробелы между атрибутами. Проблемный вариант выглядит так:
def compress_markup(self, html_blob, shrink_css, shrink_js):
    return minify_html.minify(
        html_blob,
        do_not_minify_doctype=True,
        keep_spaces_between_attributes=True,
        minify_css=shrink_css,
        minify_js=shrink_js,
    )
Что именно ломается
В библиотеке minify-html появилось несовместимое изменение (см. заметки к версии 0.16.0). Именованные параметры do_not_minify_doctype и keep_spaces_between_attributes убрали и заменили другими. В итоге старые вызовы передают имена, которых функция больше не принимает, и Python выбрасывает TypeError из‑за «unexpected keyword arguments». Плагин Pelican до сих пор использует старые имена, поэтому сбой проявляется в Pelican, хотя первопричина — изменение API в minify-html.
Если поискать по строке Unable to minify file в проекте, вы увидите цепочку вызовов со стороны Pelican, а не внутри minify-html. Нужный участок кода расположен в pelican\plugins\minify\minify.py.
Как исправить
Обновите место вызова, чтобы использовать новые имена параметров и эквивалентную логику. Цель прежняя: сохранить doctype и пробелы между атрибутами, при желании минифицируя CSS и JS. Исправленный вызов использует новые параметры minify_doctype и allow_removing_spaces_between_attributes, задавая им инвертированные булевы значения, чтобы получить то же поведение.
def compress_markup(self, html_blob, shrink_css, shrink_js):
    return minify_html.minify(
        html_blob,
        minify_doctype=False,
        allow_removing_spaces_between_attributes=False,
        minify_css=shrink_css,
        minify_js=shrink_js,
    )
Почему это важно
Сборка статического сайта должна быть детерминированной. Когда транзитивные зависимости вносят ломающие изменения, сбои проявляются там, где, казалось бы, менять ничего не могли, — из‑за чего отладка усложняется. Понимание того, что в тексте ошибки фигурирует unexpected keyword argument, и знание, откуда вызывается minify, позволяет быстро устранить проблему без отката версий.
Это также напоминание сперва проверять место вызова. Поиск строки Unable to minify file в коде Pelican сразу приводит к плагину minify, где и нужно привести имена аргументов в соответствие с текущим API minify-html.
Выводы
Если после обновления зависимостей Pelican завершается с TypeError на вызове minify(), проверьте pelican\plugins\minify\minify.py на устаревшие имена параметров. Замените do_not_minify_doctype на minify_doctype=False и keep_spaces_between_attributes на allow_removing_spaces_between_attributes=False, оставив флаги CSS и JS без изменений. Так вы сохраните исходное поведение и вернете стабильную сборку без фиксации старых версий.