Como carregar apenas um subconjunto de pacotes instalados

13

Encontrei um bug que envolvia uma interação entre vários pacotes. Para relatar o bug, preciso fornecer uma receita reproduzível que ilustra o problema. Isso requer o carregamento dos pacotes apropriados, mas nada mais do meu init e nenhum outro pacote. Qual é a melhor maneira de fazer isso?

ATUALIZAR

Para esclarecer, estou familiarizado com o conceito de filtrar meus .emacs em uma pesquisa binária para identificar o código que está causando um problema. Nessa situação, eu sei exatamente quais pacotes já estão causando o problema. O que não sei é como usar o package-sistema para carregar apenas esses poucos pacotes.

(package-initialize)carregará os pacotes, mas também tudo o mais no meu .emacs.d/elpadiretório. package-load-listpermite especificar versões específicas de pacotes a serem carregadas ou pacotes específicos a serem excluídos explicitamente . Eu preciso do inverso - como fornecer ao Emacs uma lista de pacotes para incluir , sem carregar outros pacotes no sistema elpa / package.

Tyler
fonte
Se você isolou o problema em um número finito de pacotes, tente reproduzir o problema iniciando em um .emacsarquivo em branco - instale cada pacote um por um e verifique se o problema ainda existe. Você pode se surpreender e achar o pacote responsável que não funciona bem com o outro pacote. Quando você for o mais longe possível, escreva as etapas que você usou para reproduzir o problema e envie o relatório de erros - por exemplo, iniciando no Emacs -Q , instale o pacote A, instale o pacote A e, em seguida, instale o pacote B, depois o pacote C, em seguida, abra o *Scratch*buffer e digite ...
lawlist 20/15
O que o @lawlist disse. Se você não tiver certeza de que reduziu completamente as coisas, use a pesquisa binária: remova um 1/2 arbitrário do que você tem que reprova o problema (por exemplo, remova 2 pacotes de um total de 4). Em seguida, remova 3/4, 7/8, ... cortando o código necessário para reproduzi-lo ao meio de cada vez. Da mesma forma, você pode cortar o código de um determinado pacote em 1/2, etc., para restringir as coisas a um código muito pequeno necessário para reproduzi-lo. Você pode usar o comando comment-regionpara comentar (ou C-udescomentar) uma região do texto.
22415 Drew em
Eu entendo isso em um nível de pseudo-código. Eu não entendo como, usando a família de comandos package, você carrega apenas um subconjunto dos pacotes no seu. Diretório emacs.d / elpa
Tyler
Anteriormente um mantenedor indicou que eu estava carregando tudo com pacote-inicializar, e eu não tenho certeza de como evitar esse github.com/emacs-ess/ESS/issues/140
Tyler
1
package-load-list é uma maneira de incluir explicitamente pacotes, basta remover o allsímbolo.
N21

Respostas:

10

A package-load-listvariável pode ser usada para especificar com precisão quais pacotes e versões carregar:

List of packages for `package-initialize' to load.
Each element in this list should be a list (NAME VERSION), or the
symbol `all'.  The symbol `all' says to load the latest installed
versions of all packages not specified by other elements.

For an element (NAME VERSION), NAME is a package name (a symbol).
VERSION should be t, a string, or nil.
If VERSION is t, the most recent version is activated.
If VERSION is a string, only that version is ever loaded.
 Any other version, even if newer, is silently ignored.
 Hence, the package is "held" at that version.
If VERSION is nil, the package is not loaded (it is "disabled").

A única coisa a observar é que o valor padrão inclui all, se você setqo fizer, ficará bem porque isso substitui completamente o valor original.

(require 'package)
(setq package-load-list
      '((package1 "4.2")
        (package2 "0.5.1")))
(package-initialize)
npostavs
fonte
4

Uma opção que funcionaria bem em contextos em que os desenvolvedores que estão trabalhando para reproduzir o bug ainda não possuam (ou desejam) essas dependências instaladas é usar o trypacote ( https://melpa.org/#/try ). Outros podem carregar pacotes a partir do gerenciamento de pacotes sem modificar sua instalação local.

(package-install 'try)
(require 'try)

(try 'some-package)
(try 'some-other-package)

(steps (to reproduce) (the (problem)))
ebpa
fonte
2

Este caso de uso é uma terrível deficiência de package.el, portanto, não use package.el. Em vez disso, use um gerenciador de pacotes como straight.el(eu sou o autor), que foi projetado especificamente para suportar esse caso de uso.

Para documentação detalhada sobre straight.el, incluindo comparações com outros gerenciadores de pacotes, consulte o README . Abaixo, citei a seção relevante para sua pergunta.

Usando straight.elpara reproduzir bugs

Uma das principais razões pelas quais eu queria escrever straight.elera que os gerenciadores de pacotes existentes não eram bons para reproduzir bugs. Por exemplo, alguns deles carregariam todos os pacotes instalados quando o gerenciador de pacotes foi inicializado! Obviamente, isso não é aceitável para um "caso de teste mínimo".

Pelo contrário, o bootstrapping straight.elnão carrega nada além de straight.elsi mesmo (os repositórios de receita padrão são registrados, mas não são clonados até que sejam necessários). Você normalmente deve carregar straight.elpor meio do snippet de autoinicialização , mas quando estiver dentro emacs -Q, eis como você pode inicializar straight.el:

M-x load-file RET ~/.emacs.d/straight/bootstrap.el RET

Você também pode fazer isso na linha de comando, talvez criando um alias para ele:

$ emacs -Q -l ~/.emacs.d/straight/bootstrap.el

Digamos que você esteja fazendo um relatório de erro para o Projectile. Para carregar apenas o Projectile e todas as suas dependências, execute:

M-x straight-use-package RET projectile RET

Observe que isso usará as revisões atualmente check-out do Projectile e todas as suas dependências; portanto, você deve anotá-las para fazer seu relatório de erro.

Radon Rosborough
fonte
0

Quando você precisa dele para uma única vez (por exemplo, para tentar testar uma receita para reproduzir um bug), muitas vezes você pode se safar:

emacs -Q -l ~/.emacs.d/elpa/<pkg>-<vers>/<pkg>-autoloads.el

Eu disse "frequentemente" porque não prestará atenção às dependências; portanto, em alguns casos, você precisará adicionar mais desses -l ...argumentos para carregar os outros pacotes necessários.

Stefan
fonte