OutWiker 3.0.0.852 unstable и формат snap

Привет! Сегодня я выложил следующую нестабильную версию OutWiker под номером 3.0.0.852. Если не считать исправления ошибок, то эта версия должна больше заинтересовать линуксоидов.
С версией под Linux всегда было сложно. Когда-то для распространения deb-пакетов OutWiker использовался PPA (Personal Packages Archive). В те давние времена приходилось привязываться к версиям библиотек, которые были в репозиториях Ubuntu разных версий. Но от версии к версии постоянно что-то ломалось, и поддерживать даже две-три версии этого дистрибутива было настоящим мучением. Это даже не ад DLL в Windows — это намного хуже.
После перехода на Python 3 и wxPython 4 такие deb-пакеты в принципе невозможно было создавать, потому что необходимых библиотек в стандартных репозиториях Ubuntu не стало, да и в имеющихся версиях библиотеки wxPython наблюдаются ошибки различной степени критичности. В последнее время для Ubuntu собирается deb-пакет, который содержит в себе бинарную сборку со всеми необходимыми для запуска библиотеками. Такая же сборка выкладывается в виде архива без привязки к формату deb, чтобы программу можно было бы запускать в дистрибутивах, которые не были порождены от Debian. К сожалению, успех запуска такой бинарной сборки гарантировать невозможно, потому что это грязный хак, который должен работать на всех дистрибутивах Linux только теоретически. Возникает вопрос, что делать?
OutWiker и snap
Одним из решений является формат snap. Этот формат, который в последнее время активно продвигает Canonical, должен решить сразу несколько проблем. Приложение, упакованное в формат snap, должно успешно запускаться независимо от того, в каком дистрибутиве Linux был создан такой пакет. А если уж приложение запустилось, то оно должно выполняться в своей песочнице со своей домашней папкой, причем приложение ограничено в действиях, которые может выполнять, но пользователь должен явно разрешить программе выполнять некоторые действия. Например, по умолчанию нет доступа к принтерам и подсоединенным к компьютеру флешкам.
У Canonical есть свой магазин приложений наподобие Google Play Market для Android. В этот магазин приложений могут быть добавлены программы в формате snap. Теперь у OutWiker там есть своя страничка — https://snapcraft.io/outwiker.
В последнее время я занимался упаковкой OutWiker в snap, теперь для установки OutWiker под Linux достаточно выполнить одну команду:
snap install —beta outwiker
Это даже проще, чем устанавливать приложение из PPA.
Затем, если вы хотите, чтобы OutWiker мог выводить заметки на принтер, нужно явно разрешить это делать с помощью команды
snap connect outwiker:cups-control
Аналогично можно разрешить программе доступ к флешкам:
snap connect outwiker:removable-media
На странице https://snapcraft.io/outwiker есть возможность установить OutWiker с помощью настольного приложения Desktop store.
В этом случае права на доступ к принтеру и флешкам можно установить через графический интерфейс, если нажать кнопку «Permissions».
Некоторые пользователи справедливо жаловались на дискриминацию линуксоидов — для Windows есть сборка, которая включает в себя все имеющиеся плагины, а под Linux такой сборки нет. Snap исправил эту несправедливость, он включает в себя сразу все стандартные плагины к OutWiker. Позже я добавлю плагины в бинарный deb-пакет.
Поскольку формат snap я только начал использовать, я мог не заметить какие-то проблемы, которые могут появиться при переходе к этому формату распространения. Из известных проблем — в данный момент не работает плагин ExternalTools, разбираться с ним я буду в ближайшее время.
Если вы впервые поставите OutWiker из snap, то заметите, что первый запуск будет долгий — это нормально, уже во второй раз OutWiker будет запускаться быстрее.
Сразу после первого запуска из snap программа запустится в девственно чистом виде — все настройки пропадут. Это связано с тем, что у каждой программы в формате snap своя домашняя папка. Для OutWiker она находится в ~/snap/outwiker/current/, а настройки OutWiker из snap хранятся в ~/snap/outwiker/current/.config/outwiker/. Туда вы можете скопировать свой рабочий outwiker.ini из ~/.config/outwiker/, и тогда при следующем запуске OutWiker будет настроен привычным вам образом.
В Snap Store вы можете устанавливать приложения из разных каналов — стабильные версии, бета-версии и edge-версии (самые свежие, что только существуют, можно сказать, что это альфа-версии). Каждый нестабильный релиз OutWiker попадает в канал beta, но в процессе разработки создаются сборки, которые попадают в канал edge. Если вам любопытно посмотреть на очередную версию программы до того, как она появится на сайте https://jenyay.net, то можете установить OutWiker из канала edge с помощью команды
snap install —edge outwiker
При этом имейте в виду, что в этой версии в процессе разработки может что-то ломаться.
Немного технических особенностей
Формат snap я начал изучать еще два месяца назад, разбираться с ним было не просто. Документация вроде бы есть, но она отвечает на вопрос «что можно делать?», но не на вопросы «как это работает?» и «зачем это надо?», поэтому изучать формат snap пришлось во многом методом тыка, чтением форумов и багтрекера.
С технической точки зрения пакеты snap представляют собой контейнеры LXC (Linux containers). Если вы работали с Docker, то здесь что-то подобное. Для окончательной сборки snap-пакета используется образ Ubuntu 16.04, благодаря чему обеспечивается повторяемость сборки, и должно гарантироваться выполнение приложения независимо от того, на какой системе snap собирали. По сути сборка snap представляет собой настройку образа контейнера с Ubuntu 16.04.
Формат snap мне понравился, но все-таки проблему ада библиотек он не решает полностью, и для этого формата иногда приходится исправлять исходную программу.
Появление snap-пакета OutWiker на свет сначала было легким. Все было хорошо кроме одной вещи — не работала проверка орфографии. В OutWiker для проверки орфографии используется библиотека pyenchant, которая является оболочкой над библиотекой enchant. Библиотека enchant может работать с разными движками для проверки орфографии, в том числе myspell, которая мне и нужна. Недавно автор pyenchant написал, что больше не будет поддерживать свое творение, и этот проект осиротел, что заставило меня задуматься о замене pyenchant, но в ближайшее время я этого делать не собирался.
Неработающая проверка орфографии меня удивила, библиотека просто не видела нужные словари. Я пытался собирать пакеты snap и так, и эдак, добавлял отладочную информацию. Никаких критических ошибок не возникало, библиотека успешно загружалась, но словари не видела. В качестве последнего средства спасения задал вопрос на форуме, посвященному созданию snap-пакетов. И там мне ответили, что да, это известная проблема библиотеки enchant, она не работает в snap, но есть способ ее запустить — нужно скомпилировать ее из исходников во время сборки snap-пакета. И даже подсказали, что так поступает программа poedit, и у нее можно подсмотреть код для сборки. Я так и сделал, и на тестовой программе все заработало. Но в OutWiker все осталось по-старому.
После долгих экспериментов оказалось, что библиотеку enchant еще использует движок WebKit, причем во время сборки snap-пакета он устанавливает его из репозитория Ubuntu, а то, что я в процессе сборки snap устанавливаю enchant из исходников, ни на что не влияет — в системе все равно используется версия из репозитория. Возможно, есть способ с помощью хаков заставить работать enchant, собранный из исходников, вместо enchant из репозитория, но я с этим заморачиваться уже не стал. Все сложилось вместе: и неработающий enchant, и неподдерживаемый pyenchant, поэтому я решил искать альтернативу библиотеке pyenchant.
Как ни странно, но библиотек проверки орфографии для Python нашлось не так много. Самая разумная альтернатива — это pyhunspell — очень тонкая оболочка над библиотекой hunspell (наследник myspell). Попробовал ее в тестовом snap-пакете — работает. Начал использовать ее в OutWiker — работает. Казалось бы, все хорошо, все довольны, но нет — не оказалось библиотеки pyhunspell под Windows. В интернете можно найти сборку под Windows, но старой версии и под старую версию Python. Чтобы собрать pyhunspell под Windows нужен компилятор C++, да и то сборка проходит не так гладко, как хотелось бы. Поэтому сейчас в OutWiker под Linux используется библиотека pyhunspell, а под Windows — по-прежнему pyenchant.
После удачной сборки snap-пакета OutWiker я озадачился выкладыванием его в магазин приложений. Это оказалось проще чем я думал, и меньше чем через час чтения документации и выписывания себе шпаргалки с последовательностью действий OutWiker был опубликован. Про установку OutWiker из Snap Store я писал выше.
Я надеюсь, что snap решит основные проблемы, связанные с распространением OutWiker под Linux. Если все пойдет хорошо, то можно будет отказаться от бинарных deb-пакетов, оставив только архив с бинарной сборкой на всякий случай.
В качестве альтернативы snap есть еще в чем-то похожий формат flatpak, но пока мне не хочется разбираться еще и с ним. Вы можете меня убедить его посмотреть, если напишете, чем он лучше snap.
А теперь я жду от вас отзывов по работе OutWiker, установленного из snap, на мой взгляд это перспективный формат, если его получше распиарят.
Leave a comment