Pull to refresh

Управление пакетами в Emacs

Reading time 6 min
Views 15K


Emacs'ом я пользуюсь уже довольно давно и в общем-то для всего подряд. Хотя число elisp-пакетов распространяемых вместе с этим текстовым комбайном растет постоянно, иногда все же приходится устанавливать сторонние пакеты. Со временем их количество тоже постепенно растет, для них приходится отслеживать зависимости, их также необходимо (или желательно) обновлять, в общем, стандартный набор задач для менеджера пакетов. До недавнего времени для установки elisp-пакетов я пользовался системными пакет-менеджерами под linux типа apt, portage. Определенные неудобства конечно были, но настоящие проблемы начались когда Emacs пришлось использовать под Windows и Mac OS. Кроме собственно управления пакетами, появилась необходимость синхронизировать все установленные файлы, а не только настройки в ~/.emacs.

В итоге я созрел для использования полноценного менеджера elisp-пакетов, желательно обладающего следующими качествами:
  • большая база пакетов
  • удобство создания и поддержания собственных пакетов
  • легкость синхронизации установленных пакетов между компьютерами
  • кросс-платформенность без установки дополнительных приложений

После небольшого исследования существующих возможностей получился этот обзор, в котором я подробно на остановлюсь на elpa и el-get, а также кратко расскажу о других.



Важное замечание: все нижеописанное пробовалось на стабильной версии emacs 23, более ранние версии могут не работать как описано. Специального тестирования на разных операционных системах не проводилось, некоторые мелочи выяснялись по ходу эксплуатации.

ELPA или package.el



Изначально Emacs Lisp Package Archive (именно так расшифровывается elpa) располагался здесь, оригинал до сих пор можно скачать и установить. В настоящее время package.el поддерживается в дереве разработки emacs и будет включен в релиз 24. То есть потенциально у elpa будет большая база пользователей, соответственно база пакетов будет развиваться. Кстати, он ключен в Emacs Starter Kit, это наверное самый простой способ установки elpa для новичков, плюс он работает с emacs 22, но для моих целей там слишком много ненужного. Намного проще взять package.el из дерева разработки emacs, я рекомендую вот эту версию, потому что после нее package.el перестал быть совершенно независимым.

Итак, создаем папку ~/.emacs.d/elpa для хранения всех установленных пакетов, помещаем туда скачанный файл и добавляем следущие строки в ~/.emacs:
;;; This was installed by package-install.el.
;;; Move this code earlier if you want to reference packages in your .emacs.
(when (load (expand-file-name "~/.emacs.d/elpa/package.el"))
(package-initialize))


После исполнения этой команды (или на худой конец перезапуска emacs) можно попробовать M-x list-packages для получения и просмотра списка пакетов из базы. По умолчанию используется http://elpa.gnu.org, пакетов там довольно мало, потому добавим репозитории:
;; use more repositories for elpa
(setq package-archives '(("elpa" . "http://tromey.com/elpa/")
("gnu" . "http://elpa.gnu.org/packages/")
("marmalade" . "http://marmalade-repo.org/packages/")))



Плюсы:
  • гарантированная поддержка в следующих версиях emacs;
  • абсолютно кросс-платформенно, чистый elisp;
  • централизованные репозитории облегчают поиск и тестирование новых пакетов;
  • неплохой интерфейс для поиска и просмотра пакетов.


Минусы:
  • мало дополнительной информации про (не)установленные пакеты: нет даты установки, нет названия репозитория, еще много чего нет;
  • не поддерживает список установленных пакетов, это затрудняет синхронизацию пакетов на разных машинах;
  • не умеет удалять пакеты и зависимости;


На сегодняшний день в репозиториях порядка 330 пакетов, пару месяцев назад их было около 280, прогресс налицо.

el-get.el



Найти его можно на GitHub'е (где ж еще?), где автором также предлагается Emacs Kicker в качестве альтернативы Emacs Starter Kit. Установить el-get также как и elpa можно исполнив всего одну команду, которая скачает установочный скрипт, клонирует репозиторий с github в ~/.emacs.d/el-get и инициализирует его. Поскольку ~/.emacs.d у меня уже под надзором git, я использовал git submodule:
cd ~
mkdir .emacs.d/el-get
git submodule add github.com/dimitri/el-get.git .emacs.d/el-get/el-get


Это позволит легко обновлять и сам менеджер, и базу пакетов (рецепты). Все пакеты из рецептов устанавливаются в ~/.emacs.d/el-get и не смешиваются с пакетами elpa. Для начала работы необходимо добавить в ~/.emacs следующее:

;;; check if git sumbodule is there before loading el-get
(when (file-readable-file "~/.emacs.d/el-get/el-get/el-get.el")
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(require 'el-get)
;; packages to manage
(setq el-get-sources
'((:name magit :type elpa)
))
(setq recipes
(append
'(bbdb mediawiki auctex)
(mapcar 'el-get-source-name el-get-sources)))
(el-get 'sync recipes))


После загрузки el-get код проверяет установленные пакеты и, если какие-то отсутствуют, пытается их установить. Так el-get, bbdb, mediawiki и auctex устанавливаются из собственных рецептов, а magit с использованием elpa. Кроме того возможна установка из apt-get, git и всякого прочего. При этом elpa и apt-get устанавливают пакеты в отдельные папки и в принципе могут управлять своими пакетами независимо. Что не рекомендуется, поскольку el-get создает symlink'и в своей директории, и если пакет удаляется извне, то будет неприятно. И вообще список и опции установленных пакетов лучше хранить в одном месте как показано выше, это сильно упрощает синхронизацию между компьютерами.

Рецепты также можно установить интерактивно с помощью M-x el-get-install, при этом правда можно попасть в ловушку: уже установленные пакеты не отображаются в списке автодополнения, потому и может появиться ложное впечатление, что их нет в базе. Это еще один повод держать список пакетов явно.

Кстати о синхронизации. Для установки всего нужного на новом месте мне достаточно выполнить пару команд перед запуском emacs:
cd ~
git submodule init
git submodule update



После (пере-)запуска emacs все установится автоматически. Правда есть несколько подводных камней:
  1. Если для компиляции пакета помимо emacs нужны дополнительные программы, их придется установить и заставить работать. В качестве примера приведу emacs-w3m: он требует cvs для скачивания исходников и autoconf для компиляции. Честно говоря, emacs-w3m я так и не смог заставить работать под Windows.
  2. Если использется apt-get, то под Linux пакет может быть установлен только на производных debian, на Mac OS можно использовать Fink (el-get его тоже поддерживает), но это на любителя. Плюс нужны права администратора, поскольку такой пакет устанавливается в систему.
  3. Использование symlink'ов со сторонними менеджерами пакетов сильно осложняет жизнь под Windows XP, там они тупо не поддерживаются. Хотя в нестабильной ветке вроде бы пофиксили, но я еще не пробовал.


Плюсы:
  • хранит список установленных пакетов;
  • умеет удалять пакеты;
  • работает со сторонними менеджерами пакетов, начиная с версии 2.2 все манипуляции с elpa больше не нужны, потому что el-get включает адаптированную версию;
  • в принципе кросс-платформенный (см. подводные камни выше);
  • активно разрабатывается.


Минусы:
  • не отслеживает версии вообще;
  • очень неудобный интерфейс: названия пакетов из рецептов можно посмотреть с помощью автодополнения, можно запросить дополнительную инфу по el-get-describe, но нет красивого списка описанием как в elpa.

В рецептах обнаружено порядка 350 пакетов, прибавив elpa пакеты, получим вполне красивое число. В принципе способен устанавливать пакеты из emacswiki, а это еще порядка 1660 пакетов.

Остальное



Все остальные менеджеры пакетов я просмотрел довольно бегло, список менеджеров и дополнительную информацию можно найти на EmacsWiki и StackOverflow.
  • auto-install: Использует emacswiki в качестве централизованной базы пакетов (другие опции тоже возможны), умеет отслеживать зависимости и показывать различия между версиями. Может быть установлен из el-get.
  • elinstall.el: Не очень внятная документация.
  • epackage: Должен стать Distributed Emacs Lisp Package System (DELPS), хранения и распространия пакетов используется git. идея может и неплохая, но мне не улыбается держать все дерево на диске из-за пары десятка пакетов. И вообще разработка ведется как-то вяло.
  • epkg.el: Тоже использует git, полгода в разработке, еще не закочен.
  • install.el: Видимо больше не поддерживается, последняя дата в копирайте 2006 год.
  • install-elisp.el: Предшественник auto-install, больше не поддерживается
  • jem-pkg.el: Из интересных фишек поддерживает разные конфигурации для разных машин, хотя мне как раз нужно поддерживать одинаковые пакеты и настройки для всех компьютеров. И не ясно откуда брать пакеты.
  • pases.el: Пакеты сделаны в виде Makefile'ов, их нужно собрать (вручную?), а pases установит их в emacs. Пакетов ну очень мало, в целом похоже на студенческую дипломную работу.
  • pelm: PHP Emacs Lisp Manager, истинные emacs'оводы негодут.
  • plugin.el и use-package.el по-видимому, больше не поддерживаются.


Вместо заключения отмечу, что на данный момент я пользуюсь вышеописанной связкой el-get + elpa. Когда появится время, думаю поиграться с auto-install и рассказать об этом хабрасообществу.
Tags:
Hubs:
+24
Comments 21
Comments Comments 21

Articles