Como devo agrupar o json com o meu pacote elisp?

7

Desejo distribuir um pacote elisp que usa json.el ( http://edward.oconnor.cx/2006/03/json.el ). Preciso que isso funcione para versões do emacs que não vêm com o json pré-instalado (como o OSX, que é fornecido com o emacs 22.1). Existe uma maneira recomendada para eu enviar um pacote de terceiros como o json com o meu pacote?

Vou distribuir isso no formulário de origem diretamente para os clientes.

Alex Flint
fonte
11
Se você está suportando as versões do Emacs <23, provavelmente é melhor não usar o termo "pacote" (que implica em ELPA). "Biblioteca" é o termo mais agnóstico.
phils
2
Uma opção seria usar locate-library- ou simplesmente agir em caso de (require 'json nil :noerror)falha - para verificar se jsonjá está disponível e, se não, adicionar o subdiretório da sua própria cópia à load-pathanterior require.
phils
2
Por que você precisa enviar json.elcom sua biblioteca? Basta incluir (require 'json)e adicionar uma observação no comentário (comentários do cabeçalho do arquivo) que informa aos usuários onde obter json.el. Isso é educado, suficiente e fácil para os usuários. Se sua biblioteca realmente não exige json.el , e é apenas uma coisa boa de se ter ou é necessária apenas para algumas funcionalidades (não todas), use (require 'json nil t)e adicione condições no seu código que testem sua presença (por exemplo, featurepou fboundpou boundp). Você também pode usar (require 'json nil t)em uma determinada definição de função.
Desenhou
O Emacs-22 embutido no OSX não é apenas antigo, ouvi dizer que também é prejudicado por sua falta de suporte a GUI; portanto, é melhor não usá-lo.
Stefan

Respostas:

7

Como outros já apontaram, se você está alvejando o Emacs 23 ou mesmo 22, não possui um "pacote", mas apenas uma biblioteca. “Pacotes” não existem no Emacs anteriores ao Emacs 24 quando o gerenciador de pacotes foi adicionado.

Empacotando com uma Biblioteca

Empacote.

Como não há uma maneira padrão de instalar bibliotecas antes dos pacotes, você pode agrupar o json.el no que você der aos seus usuários - algum tipo de arquivo que eu presumo. Eles terão que instalá-lo manualmente de qualquer maneira e, assim, poderão escolher os arquivos de que precisam: Apenas sua biblioteca para usuários do Emacs 24/25, sua biblioteca + json.el para aqueles com versões mais antigas.

Enquanto você documentar isso, não causará nenhum problema.

Empacotando com um pacote

Não empacote absolutamente.

No entanto, se você criar um pacote adequado para o Emacs 24 e superior, não deverá incluí-lojson.el .

O gerenciador de pacotes instalará com prazer sua cópia empacotada json.eljunto com sua biblioteca real. Como os pacotes que vêm em primeiro lugar na load-pathsua cópia empacotada json.el, agora substituirão a incorporada, causando todos os tipos de problemas para os pacotes que esperam uma versão mais recente do json.el.

O caminho a percorrer (na minha opinião)

Crie duas distribuições do seu pacote:

  • Um pacote Emacs adequado para o Emacs 24 e superior, por exemplo, um TAR com os metadados do pacote correspondente. Você pode até hospedar um pequeno repositório de pacotes com o seu pacote para distribuir atualizações aos usuários do Emacs 24 automaticamente.
  • Um arquivo TAR com sua biblioteca e json.el, mas sem metadados de pacote para usuários de versões mais antigas do Emacs.

A única coisa que você precisa observar é quando os usuários de versões mais antigas do Emacs atualizam para o Emacs 24. Nesse caso, eles terão que remover manualmente a instalação anterior da sua biblioteca json.ele instalar o pacote apropriado do Emacs 24 novamente.

Uma alternativa

Se você não deseja manter duas distribuições diferentes, é possível agrupar json.el, mas com um nome diferente, por exemplo my-library-json-compat.el. Com um nome diferente, sua cópia do pacote json.elnunca substituirá a incorporada.

Como as funções e os símbolos da cópia em pacote ainda conflitam com a incorporada, você deve tomar cuidado para não carregar sua cópia em pacote quando o real json.elestiver disponível, mas isso é fácil:

(unless (require 'json nil 'no-error)
  (require 'json "my-library-json-compat"))

O Emacs tentará carregar json.ele, na sua falta, retornará à sua cópia agrupada com um nome diferente.

O verdadeiro caminho a percorrer (na minha opinião)

Diga aos seus usuários para atualizarem para o Emacs 24. A última versão do Emacs 22 é de oito (!) Anos atrás, a última versão do Emacs 23 ainda há quatro anos. Ambas as versões estão desatualizadas e carecem de muitos recursos, e muitos pacotes (por exemplo, Magit) suportam apenas o Emacs 24 atualmente. O Emacs 22/23 é um beco sem saída e não há como avançar com eles.

A atualização para o Emacs 24 é fácil: a maioria das distribuições Linux modernas inclui pelo menos o Emacs 24.1 em seus repositórios de pacotes. Estão disponíveis pacotes de aplicativos pré-criados para o OS X , e o mais recente Emacs 24 estável está incluído no popular Homebrew, gerenciador de pacotes do OS X.


fonte