Как генерировать и активировать автозагрузки для локальных пакетов?

9

Ясно, что не все локальные / пользовательские / персональные пакеты должны быть официально выпущены, и было бы глупо делать это только для того, чтобы воспользоваться встроенной поддержкой управления пакетами. Мне интересно, как генерировать и активировать автозагрузки для локальных пакетов? Это похоже на то, как package.elэто делается для установленных пакетов от ELPA. Чтобы избежать повторного изобретения колеса, есть ли способ «притвориться», что какой-то локальный каталог (с подкаталогами, каждый из которых является локальным / пользовательским / личным пакетом) является ELPA? Я также открыт, el-getесли такой сценарий может быть поддержан, например, с помощью пользовательских рецептов.

Я уверен, что задача довольно распространенная, и любой, кто использует Emacs на продвинутом уровне, рано или поздно приходит к этому. Кто-нибудь может поделиться своим опытом в этой области?

Александр Шукаев
источник
3
update-directory-autoloadsможет использоваться независимо от любого менеджера пакетов.
npostavs
@npostavs, я знаю, но это не рекурсивно, и это не всестороннее решение в этом случае. Наверняка этого будет недостаточно, и мне пришлось бы обернуть это в мою собственную реализацию.
Александр Шукаев
1. Вы можете предоставить список dir (например, dir и его потомков) update-directory-autoloads, чтобы, по сути, сделать его рекурсивным. 2. Вы можете использовать update-file-autoloadsлюбой файл, который вас интересует, независимо от того, в каком каталоге он находится.
Drew
К вашему сведению: package.elтакже не является рекурсивным (то есть не поддерживает пакеты с источниками в подкаталогах).
npostavs
Я установил локальный MELPA на Linux. У меня нет хорошего решения для окон. Я действительно хотел бы, чтобы Emacs поддерживал этот тип вещей из коробки. Может стоит проверить use-package, чтобы узнать, может ли он.
eflanigan00

Ответы:

7

Правильное решение (IMO) - использовать менеджер пакетов, который явно поддерживает этот вариант использования. Это было бы straight.el, что я написал для этой цели.

Вы можете прочитать подробную документацию, включая сравнения с другими менеджерами пакетов, в README , поэтому я буду придерживаться того, как вы можете использовать ее straight.elдля решения вашей конкретной проблемы.

  1. Поместите свой репозиторий в ~/.emacs.d/straight/repos/<my-repo>.
  2. Загрузите его, используя

    (straight-use-package '(<my-package> :local-repo "<my-repo>"))
    
  3. Вы сделали Всякий раз, когда вы вносите изменения в исходный код, генерация автозагрузки и байтовая компиляция будут выполняться заново (при следующем запуске Emacs). Вы также получаете такие вещи, как управление зависимостями, дополнительная автоматизация контроля версий и т. Д. Бесплатно.

  4. Когда (если) вы хотите опубликовать пакет, просто нажмите его где-нибудь и измените рецепт, чтобы он указывал на этот репозиторий Git.
  5. Вы также можете использовать straight.elс, use-packageесли вы предпочитаете (это просто синтаксический сахар по большей части).
Радон Росборо
источник
3

Я делаю следующее в Linux:

Я установил локальный репозиторий melpa путем клонирования melpa.

Я изменяю рецепты, которые я хочу указать на мои местные пакеты. Следующееlocal-melpa/recipies/ace-window

(ace-window
  :url "/home/my_home/.emacs.d/packages/ace-window/"
  :fetcher git)

Затем из типа local-mepla make allили make recipies/ace-windowдля сборки пакета (ов) вlocal-melpa/packages

Затем make packages/archive-contents, который заполняет список пакетов.

Тогда в использовании, чтобы последовать, чтобы сказать Emacs использовать мой локальный melpa

(setq package-archives '(("local-melpa" . "~/.emacs.d/packages/local-melpa/packages/")))

Я не понял, как запустить makeна окнах. Но я могу собрать пакеты в local-melpaLinux и скопировать их в Windows, и emacs понимает и устанавливает пакеты правильно.

Преимущество этого заключается в том, что я могу выполнить сброс в любое время, если захочу, удалив мой ~/.emacs.d/elpa/*каталог и установив любые пользовательские обновления в любой пакет.

eflanigan00
источник
Возможно, кельпа также будет интересна?
npostavs
Думаю, вы правы. Я должен сесть и посмотреть на это.
eflanigan00
2

Если вы заменили уже установленный пакет другой версией, и вам не хватает только файла автозагрузки, вы можете использовать package-generate-autoloads для его генерации:

(package-generate-autoloads "async" "~/.emacs.d/elpa/async-1.9.3/")

Я обнаружил, что проще, чем использовать update-directory-autotools, когда мне нужно понизить пакет до более ранней версии.

На самом деле я думаю, что я не очень ответил на ваш вопрос. Я пока оставлю этот ответ здесь, но мой ответ более актуален здесь: /programming/26348561/how-to-generate-autoloads-for-elpa-packages/50100170

Андреас Растер
источник