Jak załadować tylko podzbiór zainstalowanych pakietów

13

Natknąłem się na błąd związany z interakcją między kilkoma pakietami. Aby zgłosić błąd, muszę podać powtarzalny przepis ilustrujący problem. Wymaga to załadowania odpowiednich pakietów, ale nic więcej od mojego init i żadnych innych pakietów. Jak najlepiej to zrobić?

AKTUALIZACJA

Aby to wyjaśnić, jestem zaznajomiony z koncepcją przeszukiwania moich .emacs podczas wyszukiwania binarnego w celu zidentyfikowania kodu powodującego problem. W tej sytuacji wiem już dokładnie, jakie pakiety powodują problem. Nie wiem, jak używać package-systemu do ładowania tylko tych kilku pakietów.

(package-initialize)załaduje pakiety, ale także wszystko inne w moim .emacs.d/elpakatalogu. package-load-listpozwala mi określić określone wersje pakietów do załadowania lub konkretne pakiety do jawnego wykluczenia . Potrzebuję odwrotnej strony - jak dostarczyć Emacsowi listę pakietów do włączenia , bez ładowania innych pakietów w systemie elpa / package.

Tyler
źródło
Jeśli problem został wyizolowany ze skończonej liczby pakietów, możesz spróbować odtworzyć problem, zaczynając od pustego .emacspliku - zainstaluj każdy pakiet jeden po drugim, a następnie sprawdź, czy problem nadal występuje. Możesz zaskoczyć siebie i znaleźć odpowiedzialnego pakietu, który nie gra dobrze z innym pakietem. Kiedy zaszedłeś tak daleko, jak to możliwe, napisz kroki, które wykorzystałeś do odtworzenia problemu i prześlij raport o błędzie - np. Zaczynając od Emacsa-Q , zainstaluj pakiet A, następnie zainstaluj pakiet B, a następnie zainstaluj pakiet C, następnie otwórz *Scratch*bufor i wpisz ...
lista prawna
Co powiedziała @lawlist. Jeśli nie masz pewności, czy wszystko zawęziłeś do końca, skorzystaj z wyszukiwania binarnego: usuń dowolną 1/2 tego, co masz, co odwraca problem (np. Usuń 2 paczki z 4). Następnie usuń 3/4, 7/8, ... odcinając kod potrzebny do powtórnego przepisania go za każdym razem. Możesz podobnie posiekać kod danego pkg na 1/2 itd., Aby zawęzić zawartość do bardzo małej ilości kodu potrzebnego do jego przepisania. Możesz użyć polecenia, comment-regionaby skomentować (lub C-ucofnąć komentarz) region tekstu.
Drew
Rozumiem to na poziomie pseudokodu. Nie rozumiem, w jaki sposób za pomocą pakietu poleceń z rodziny ładujesz tylko podzbiór pakietów. katalog emacs.d / elpa
Tyler
Poprzednio opiekun wskazywał, że ładuję wszystko za pomocą inicjalizacji pakietu i nie jestem pewien, jak tego uniknąć github.com/emacs-ess/ESS/issues/140
Tyler
1
package-load-list jest sposobem na jawne dołączenie pakietów, wystarczy usunąć allsymbol.
npostavs

Odpowiedzi:

10

package-load-listZmienna może być użyta do określenia dokładnie jakie pakiety i wersje załadować:

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").

Jedyną rzeczą, na którą należy zwrócić uwagę, jest to, że domyślna wartość obejmuje all, jeśli setqto zrobisz, wszystko będzie dobrze, ponieważ całkowicie zastąpi pierwotną wartość.

(require 'package)
(setq package-load-list
      '((package1 "4.2")
        (package2 "0.5.1")))
(package-initialize)
npostavs
źródło
4

Opcją, która działałaby dobrze w kontekstach, w których programiści zajmujący się odtwarzaniem błędu mogą nie mieć (lub nie chcieć) tych zainstalowanych zależności, jest użycie trypakietu ( https://melpa.org/#/try ). Inni mogą ładować pakiety z zarządzania pakietami bez modyfikowania ich instalacji lokalnej.

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

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

(steps (to reproduce) (the (problem)))
ebpa
źródło
2

Ten przypadek użycia jest strasznym niedoborem package.el, więc nie używaj package.el. Zamiast tego użyj menedżera pakietów, takiego jak straight.el(jestem autorem), który został specjalnie zaprojektowany do obsługi tego przypadku użycia.

Pełna dokumentacja dotycząca straight.el, w tym porównań z innymi menedżerami pakietów, znajduje się w pliku README . Poniżej zacytowałem sekcję dotyczącą twojego pytania.

Używanie straight.eldo odtwarzania błędów

Jednym z głównych powodów, dla których chciałem napisać, straight.elbyło to, że istniejące menedżery pakietów nie nadawały się do odtwarzania błędów. Na przykład niektóre z nich ładowałyby wszystkie zainstalowane pakiety podczas inicjowania menedżera pakietów! Oczywiście nie jest to dopuszczalne w przypadku „minimalnego przypadku testowego”.

Przeciwnie, ładowanie początkowe straight.elnie ładuje niczego poza straight.elsobą (domyślne repozytoria receptur są rejestrowane, ale nie klonowane dopóki nie będą potrzebne). Zwykle powinieneś się ładować straight.elza pomocą fragmentu bootstrap , ale kiedy jesteś w tym emacs -Qmiejscu, możesz zainicjować straight.el:

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

Możesz to również zrobić z wiersza poleceń, być może tworząc dla niego alias:

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

Załóżmy, że tworzysz raport o błędzie dla pocisku. Aby załadować tylko pocisk i wszystkie jego zależności, uruchom:

M-x straight-use-package RET projectile RET

Zauważ, że użyje to obecnie sprawdzonych wersji pocisku i wszystkich jego zależności, więc powinieneś je zanotować, aby sporządzić raport o błędzie.

Radon Rosborough
źródło
0

Gdy potrzebujesz go jednorazowo (np. W celu przetestowania przepisu w celu odtworzenia błędu), często możesz uniknąć:

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

Powiedziałem „często”, ponieważ nie zwróci uwagi na zależności, więc w niektórych przypadkach będziesz musiał dodać więcej tych -l ...argumentów, aby załadować inne potrzebne pakiety.

Stefan
źródło