Работа с RAR архивами в Go
RAR — популярный, но проприетарный формат архивов. Его последняя версия RAR5 использует закрытые алгоритмы, из-за чего поддержка в сторонних библиотеках крайне ограничена. Что касается Go — либо библиотеки устарели, либо не поддерживают RAR5, либо требуют внешние утилиты
📚 Формат RAR: особенности
| Возможность | Поддержка |
|---|---|
| Эффективное сжатие | ✅ |
| Пароли (AES) | ✅ |
| Восстановление данных | ✅ |
| Многотомные архивы | ✅ |
| Unicode в именах | ✅ |
| Открытая спецификация | ❌ |
| Open-source реализация | ❌ |
RAR5 требует лицензионных алгоритмов от RARLab. Это делает реализацию полноценной поддержки без внешних бинарников проблематичной.
🔎 Библиотеки Go для работы с RAR
| Библиотека | Пароли | RAR5 | Особенности |
|---|---|---|---|
rardecode |
❌ | ❌ | Чистый Go. Только RAR1–4. Не требует внешних зависимостей. |
go-unarr |
⚠️ | ⚠️ | CGO-обёртка над libunarr. Частичная поддержка RAR5. Только чтение. |
xtractr |
✅ | ❌ | Обёртка над rardecode. Поддержка Unicode, паролей. |
archiver (deprecated) |
❌ | ❌ | Устаревший универсальный архиватор. Использует rardecode, поддержка RAR ограничена. Рекомендуется переход на mholt/archives. |
mholt/archives |
✅* | ⚠️ | Кросс-платформенная библиотека. Читает 7z и RAR с паролями; ZIP с паролями — не поддерживает. Поддержка RAR — только чтение; для RAR5 — частичная (см. пояснение ниже). |
Внешние утилиты (unrar, 7z) |
✅ | ✅ | Полная поддержка. Требуется установка бинарников. |
Примечания:
✅*— вmholt/archivesподдерживается чтение паролей для 7-Zip и RAR; для ZIP пароли не поддерживаются- Для RAR5 во всех чисто-Go решениях поддержки нет; частичная поддержка обычно достигается через C‑библиотеки/обёртки и ограничивается чтением
Пояснения по поддержке/ограничениям:
rardecode- Только чтение, форматы RAR 1–4; RAR5 не поддерживается
- Пароли не поддерживаются
- Практически не покрывает сложные кейсы (solid, многотомность, восстановительные записи и т.п.)
go-unarr- Только чтение; запись не поддерживается
- RAR5 — частично: «простые» односоставные архивы чаще открываются; многотомные/solid и “экзотические” варианты могут не работать
- Пароли — частично; шифрование заголовков может не распознаваться
- Требует CGO и системных библиотек (
libunarr), что усложняет кросс-компиляцию/деплой
xtractr- Обёртка над
rardecode→ наследует его ограничения по RAR: нет RAR5 - Пароли поддерживаются для RAR1–4; для RAR5 соответственно — нет
- Удобный высокоуровневый API (фильтрация, кодировки имён), но базовые возможности зависят от
rardecode
- Обёртка над
archiver(deprecated)- Проект устарел; для новых задач рекомендован
mholt/archives - Для RAR использует
rardecode→ нет RAR5, нет паролей
- Проект устарел; для новых задач рекомендован
mholt/archives- Частичная поддержка RAR5 в этом случае означает:
- Только чтение (запись/создание RAR/RAR5 отсутствует)
- Стабильнее работают одиночные не‑solid архивы; многотомные и solid могут не поддерживаться или быть нестабильными
- Возможна распаковка с паролем, но шифрование заголовков и отдельные режимы могут не распознаваться
- Сервисные структуры (recovery record, комментарии, EAs/ACL/ADS, ссылки, права/времена) могут игнорироваться
- Совместимость варьируется между архиваторами; для проблемных кейсов лучше использовать
unrar/7z
- Пароли для ZIP не поддерживаются
- Частичная поддержка RAR5 в этом случае означает:
- Внешние утилиты (
unrar,7z)- Наиболее полная и надёжная поддержка RAR/RAR5, включая зашифрованные, solid и многотомные архивы
7zне создаёт RAR, только извлекает; старые версии могут хуже справляться с некоторыми вариантами RAR5- Требуется наличие бинарников в окружении
🛠 Внешние утилиты (unrar, 7z)
1
2
exec.Command("unrar", "x", "simple.rar", "/out")
exec.Command("7z", "x", "protected.rar", "-pMYPASSWORD")
- Поддержка всех версий RAR, включая RAR5
- Работают стабильно, но требуют наличия бинарников
Пример установки (Debian/Ubuntu):
1
2
sudo apt update
sudo apt install unrar p7zip-full p7zip-rar
❓ Стоит ли готовить собственную реализацию?
Оптимальный вариант:
- Пишем обёртку над
unrar/7zс fallback наxtractrиmholt/archives, что обеспечит максимальный охват функциональности для работы с архивами.
Проблемы:
- Нельзя легально реализовать алгоритмы RAR5
- Поддержка шифрования и многотомности — сложная и хрупкая область
- Архивы RAR5 (особенно solid/многотомные) могут вести себя нестабильно в сторонних реализациях
✅ Что выбрать под конкретную задачу
| Сценарий | Рекомендация |
|---|---|
| Только RAR v1–v4 | rardecode, xtractr |
| Поддержка RAR5 (надёжно) | Внешние утилиты (unrar, 7z) |
| Допустим CGO и нужен read-only | go-unarr или mholt/archives |
| Универсальность (ZIP/TAR/7z/RAR) | mholt/archives (вместо archiver), с учётом ограничений по ZIP‑паролям и частичной поддержке RAR5 |
| Гибкость и контроль | Обёртка над unrar + fallback (xtractr/mholt/archives) |
🧾 Вывод
Формат RAR, особенно RAR5, — проблемный для Go. Из-за закрытой природы и юридических ограничений единственный практичный путь для полной поддержки — использовать обёртки над внешними утилитами (unrar, 7z) и дополнять их:
xtractr— для старых архивов (RAR1–4) с поддержкой шифрования,mholt/archives— как универсальный слой чтения, умеющий в пароли для RAR/7z, но без паролей для ZIP, и с частичной поддержкой RAR5 (только чтение, ограниченные сценарии).
Больше полезной информации в
Telegram-канале
