44.1 Основы упаковки

Пакет может быть либо простым пакетом, либо многофайловым пакетом. Простой пакет хранится в архивном пакете как один файл Emacs Lisp, в то время как многофайловый пакет хранится как tar-файл (содержащий несколько файлов Lisp и, возможно, не-Lisp файлы, такие как руководство).

В обычном использовании разница между простыми и многофайловыми пакетами не имеет большого значения; интерфейс Меню пакетов не проводит различий между ними. Однако процедура их создания отличается, как объясняется в следующих разделах.

Каждый пакет (будь то простой или многофайловый) имеет определенные атрибуты:

Имя

Короткое слово (например, ‘auctex’). Обычно это также префикс символа, используемый в программе (см. Соглашения по кодированию Emacs Lisp).

Версия

Номер версии в формате, понятном функции version-to-list (например, ‘11.86’). Каждое издание пакета должно сопровождаться увеличением номера версии, чтобы оно было распознано как обновление пользователями при запросе архивного пакета.

Краткое описание

Это отображается, когда пакет отображается в Меню пакетов. Оно должно занимать одну строку, в идеале не более 36 символов.

Подробное описание

Это отображается в буфере, созданном командой C-h P (describe-package), после краткого описания пакета и статуса установки. Обычно оно занимает несколько строк и должно полностью описывать возможности пакета и то, как начать его использовать после установки.

Зависимости

Список других пакетов (возможно, включая минимально допустимые номера версий), от которых зависит этот пакет. Список может быть пустым, что означает, что у этого пакета нет зависимостей. В противном случае установка этого пакета также автоматически устанавливает его зависимости рекурсивно; если какая-либо зависимость не может быть найдена, пакет не может быть установлен.

Установка пакета, либо с помощью команды package-install-file, либо через Меню пакетов, создает подкаталог package-user-dir с именем name-version, где name — это имя пакета, а version — его версия (например, ~/.emacs.d/elpa/auctex-11.86/). Мы называем это каталогом содержимого пакета. Именно сюда Emacs помещает содержимое пакета (один файл Lisp для простого пакета или файлы, извлеченные из многофайлового пакета).

Затем Emacs ищет во всех файлах Lisp в каталоге содержимого магические комментарии автозагрузки (см. Автозагрузка). Эти определения автозагрузки сохраняются в файл с именем name-autoloads.el в каталоге содержимого. Обычно они используются для автозагрузки основных команд пользователя, определенных в пакете, но они также могут выполнять другие задачи, такие как добавление элемента в auto-mode-alist (см. Как Emacs выбирает основной режим). Обратите внимание, что пакет обычно не автозагружает каждую функцию и переменную, определенную в нем — только небольшое количество команд, которые обычно вызываются для начала использования пакета. Затем Emacs байт-компилирует каждый файл Lisp в пакете.

После установки пакет загружается: Emacs добавляет каталог содержимого пакета в load-path и вычисляет определения автозагрузки в name-autoloads.el.

При каждом запуске Emacs автоматически вызывает функцию package-activate-all, чтобы сделать установленные пакеты доступными для текущей сессии. Это происходит после загрузки файла ранней инициализации, но до загрузки основного файла инициализации (см. Сводка: последовательность действий при запуске). Пакеты не становятся доступными автоматически, если опция пользователя package-enable-at-startup установлена в nil в файле ранней инициализации.

Функция: package-activate-all

Эта функция делает пакеты доступными для текущей сессии. Опция пользователя package-load-list указывает, какие пакеты сделать доступными; по умолчанию доступны все установленные пакеты. См. Установка пакетов в Руководство GNU Emacs.

В большинстве случаев вам не нужно вызывать package-activate-all, поскольку это делается автоматически при запуске. Просто убедитесь, что любой код, который должен выполниться до package-activate-all, находится в файле ранней инициализации, а любой код, который должен выполниться после него, — в основном файле инициализации (см. Файл инициализации в Руководство GNU Emacs).

Команда: package-initialize &optional no-activate

Эта функция инициализирует внутренний реестр Emacs о том, какие пакеты установлены, а затем вызывает package-activate-all.

Необязательный аргумент no-activate, если он не равен nil, заставляет Emacs обновить свой реестр установленных пакетов, не делая их фактически доступными.