Aktualizacja pakietów w Emacsie

144

Mam następującą konfigurację dla pakietów (nie jestem pewien, czy istnieje lepsza zalecana):

(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/") 
                          ("gnu" . "http://elpa.gnu.org/packages/")
                          ("marmalade" . "http://marmalade-repo.org/packages/")))

; Apparently needed for the package auto-complete (why?)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)
(setq url-http-attempt-keepalives nil)

Mam trzy pytania związane z instalacją i aktualizacją pakietów.

Q1. Czy istnieje sposób zaktualizowania listy dostępnych pakietów (i najnowszych wersji) i zaktualizowania określonego pakietu?

P.2 Jaka jest różnica między następującymi źródłami pakietów ?:

  • ELPA,
  • GNU ANTYLOPA
  • marmolada
  • melpa

P.3 Czy ma znaczenie kolejność, w jakiej są dodawane package-archives?

Amelio Vazquez-Reina
źródło
13
MELPA jest potrzebna do autouzupełniania, ponieważ oczywiście nikt nie zadał sobie trudu, aby autouzupełnianie było dostępne w Marmalade. Nie zawracaj sobie głowy, a raczej posprzątaj swój plik package-archives. Pozbądź się archiwum ELPA, które nie jest już obsługiwane, oraz archiwum marmolady, które jest bałaganem przestarzałych i zduplikowanych pakietów bez jasnych wskazówek i konserwacji. Używaj tylko standardowego archiwum GNU i MELPA>
lunaryorn
2
Dzięki @lunaryorn! To bardzo pomocne. Czy wiesz, jak mogłem być informowany o takich sprawach? (tj. „dobre rzeczy, które warto wiedzieć”, takie jak te, gdy Emacs ewoluuje)
Amelio Vazquez-Reina,
3
Informacje swobodnie krążą w sieci, po prostu je złap: śledź / emacs na Reddit, śledź blogi i twitter znanych osób z Emacsa, takich jak Nic Ferrier, Bozhidar Batsov, Magnar Sveen, John Wiegley itp., Dołącz do #emacs na Freenode IRC, i wiele więcej.
lunaryorn
3
Powinieneś, (setq package-enable-at-startup nil)jeśli masz do (package-initialize)siebie zadzwonić .
phils
2
Dzięki @phils - dlaczego jest to potrzebne?
Amelio Vazquez-Reina,

Odpowiedzi:

163
  1. Aby automatycznie zaktualizować listę pakietów, tylko jeśli nie ma jeszcze listy pakietów , użyj:

    (when (not package-archive-contents)
        (package-refresh-contents))
    

    Aby zaktualizować wszystkie zainstalowane pakiety, wpisz package-list-packages, co przeniesie Cię do *Packages*bufora (a także zaktualizuje listę pakietów), a następnie wpisz U x.

    package-refresh-contentsbezwarunkowo próbuje pobrać listę pakietów ze wszystkich repozytoriów, do których dodałeś package-archives; package-archive-contentsnie jest zerowe, jeśli już pobrałeś listę pakietów.

  2. ELPA to oryginał. Nie sądzę, że jest już naprawdę utrzymywany, ale nie jestem pewien. Ja tego nie używam.

    GNU jest „oficjalne”. Jest utrzymywany wraz z Emacsem, co oznacza, że ​​wszystko powinno zawsze działać, ale aktualizacje i nowe pakiety nie pojawiają się zbyt często.

    Marmolada to w zasadzie strona internetowa, na której można załadować kompletny pakiet i zostanie on dodany do repozytorium marmolady. Nie wystarczy po prostu przesłać łącze do źródła pakietu, a to nie do końca automatyzuje tworzenie pakietu. Myślę, że to właściwa rzecz, ponieważ niekoniecznie chcesz śledzić pod prąd. Niestety od jakiegoś czasu nie był konserwowany, ale ktoś niedawno go przejął, więc w pewnym momencie powinien wrócić i lepiej.

    Melpa pobiera adres URL np. Do obszaru lisp EmacsWiki lub repozytorium github i automatycznie buduje z niego pakiet. W związku z tym zwykle jest co najwyżej dzień za tym, co śledzi. Mimo że śledzi w górę, w praktyce nigdy nie miałem problemu i stąd pochodzi większość moich pakietów. Jest też Melpa Stable , która jest podobna do Melpa, ale przechwytuje oznaczone wersje repozytorium głównego zamiast najnowszej wersji. Stajnia Melpa ma mniej pakietów niż Melpa.

    Tryb organizacji ma swoje własne package.elrepozytorium ( http://orgmode.org/elpa/ ).

    Wszystkie repozytoria pakietów działają tak samo, wystarczy dodać je do pliku package-archives.

    Oto bardziej szczegółowy wpis na blogu na ten temat, z którym w większości się zgadzam.

  3. Nie jestem pewien, ale myślę, że jeśli pakiet jest zduplikowany w różnych repozytoriach, kolejność, w jakiej pojawiają się repozytoria, package-archivesokreśla pierwszeństwo. Nie wiem, czy wyższy priorytet znajduje się na początku czy na końcu listy.

    Aktualizacja: W Emacs 25 jest zmienna package-archive-priorities, której możesz użyć do nadania priorytetu repozytorium pakietów (np. Preferuj ELPA zamiast MELPA).


Oto odpowiednia sekcja mojej init.el, jeśli jesteś zainteresowany:

(setq jpk-packages
      '(
        ac-dabbrev
        ...
        yasnippet
        ))

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-archives
             '("org" . "http://orgmode.org/elpa/"))

;; install any packages in jpk-packages, if they are not installed already
(let ((refreshed nil))
  (when (not package-archive-contents)
    (package-refresh-contents)
    (setq refreshed t))
  (dolist (pkg jpk-packages)
    (when (and (not (package-installed-p pkg))
             (assoc pkg package-archive-contents))
      (unless refreshed
        (package-refresh-contents)
        (setq refreshed t))
      (package-install pkg))))

(defun package-list-unaccounted-packages ()
  "Like `package-list-packages', but shows only the packages that
  are installed and are not in `jpk-packages'.  Useful for
  cleaning out unwanted packages."
  (interactive)
  (package-show-package-list
   (remove-if-not (lambda (x) (and (not (memq x jpk-packages))
                            (not (package-built-in-p x))
                            (package-installed-p x)))
                  (mapcar 'car package-archive-contents))))
jpkotta
źródło
2
Dzięki! Co when (not package-archive-contents)sprawdza?
Amelio Vazquez-Reina
3
Warunek zapobiega odświeżaniu za każdym razem, gdy uruchamiam emacsa (zwykle chcę, aby sprawdzał tylko wtedy, gdy mu każę). Sprawdza tylko, czy nie ma archiwów pakietów, co powinno mieć miejsce tylko przy pierwszym klonowaniu konfiguracji na nowy komputer.
jpkotta,
Po prostu powiadamiam Cię o odpowiedzi @Brandy Trainor, która wydaje się uzupełniać Twoją odpowiedź - na wypadek, gdyby była pomocna.
Amelio Vazquez-Reina,
Myślę, że musi to wywołać (refresh-package-contents)bezwarunkowo przed pobraniem nowych pakietów, ponieważ w przeciwnym razie Emacs może spróbować pobrać starą wersję pakietu (która jest do tego czasu 404), zawieść i zatrzymać ładowanie.
Vladimir Panteleev
Jaki jest najlepszy sposób, aby dowiedzieć się, który pakiet jest niepożądany? @jpkotta
alper
103

W Emacsie użyj, M-x list-packagesaby wyświetlić listę wszystkich pakietów, co spowoduje automatyczne odświeżenie zawartości archiwum. Następnie użyj, Uaby zaznaczyć wszystkie pakiety, które można uaktualnić, xdo aktualizacji i faktycznie wykonać nowe aktualizacje. Emacs pobierze i zainstaluje wszystkie aktualizacje i zapyta, czy później usunąć stare, przestarzałe wersje.

Możesz również rzucić okiem na Carton, który zapewnia wygodniejszy sposób zarządzania pakietami, deklarując je w dedykowanym pliku, i zawiera wygodnego klienta wiersza poleceń do automatycznej instalacji i aktualizacji pakietów zadeklarowanych w ten sposób.


Kolejność package-archivesnie ma znaczenia. Emacs agreguje zawartość wszystkich archiwów w jedną spójną listę dostępnych pakietów i ich wersji, przechowywanych w plikach package-archive-contents.

Po tym package-installEmacs po prostu wybierze najnowszą wersję pakietu, niezależnie od archiwum, z którego pochodzi. Aby uzyskać większą kontrolę nad pochodzeniem pakietu, MELPA udostępnia pakiet melpa, który umożliwia umieszczanie na czarnej lub białej liście pakietów z określonych archiwów.

lunaryorn
źródło
2
Mówiąc S-udokładniej.
Lenar Hoyt
@mcb Co S-u? Menu pakietów nie używa tego powiązania.
lunaryorn
2
Mam na myśli Shift-uto.
Lenar Hoyt
8
@mcb Cóż, właśnie dlatego napisałem wielką literę U 😊
lunaryorn
1
Tylko dla zdezorientowanych, takich jak ja, myślą, że oznacza to <kbd> U </kbd>.
Lenar Hoyt
23

W terminalu:

emacs

M-x list-packages

to umieszcza cię w buforze * packages *

shift-u x

emacs zapyta cię (t / n), poczekaj na aktualizacje

C-x k <ret>

to zabije bufor * pakietów * i wróci do * zera *

C-x-C-c

spowoduje to zamknięcie emacsa i ponowne uruchomienie przez, ale może być konieczne debugowanie :(

emacs

moje 2 ¢

rezwits
źródło
Otrzymałem „nie określono polecenia” lub coś w tym stylu, kiedy wpisałem „U”. Po uruchomieniu M-x package-refresh-contentspoprosił mnie o wpisanie „U”, aby zaznaczyć wszystkie do aktualizacji, a następnie mogłem wpisać „x”, aby uruchomić aktualizacje.
MrColes
2

To jest bardziej rozbudowany komentarz do odpowiedzi jpkotta.

To jest korekta, z którą eksperymentuję w odpowiedzi jpkotta powyżej:

(setq n 0)                                  ; set n as 0
(dolist (pkg pkgs-2b-present)               ; for each pkg in list
  (unless (or                               ; unless
           (package-installed-p pkg)        ; pkg is installed or
           (assoc pkg                       ; pkg is in the archive list
                  package-archive-contents))
    (setq n (+ n 1))))                      ; add one to n
(when (> n 0)                               ; if n > 0, 
  (package-refresh-contents))               ; refresh packages

(wymiana (when (not package-archive-contents) (package-refresh-contents))).

Lista pakietów nie odświeżała się wystarczająco często dla mojego przypadku użycia.

Nie zastanawiałem się, czy istnieje skuteczniejsze rozwiązanie mojego problemu; najpierw muszę sprawdzić, czy problem zniknie po tej regulacji.

Brady Trainor
źródło
W mojej odpowiedzi package-archive-contentsjest odświeżana tylko wtedy, gdy jej nie ma. Chodzi o to, że kopiujesz plik .emacs.d na nową maszynę i automatycznie instaluje on wszystkie pakiety, ale potem musisz ręcznie zaktualizować. Staram się aktualizować mniej więcej raz na dwa tygodnie. Zgaduję, że dodałeś pakiet do swojej listy, ale byłeś package-archive-contentsza stary, aby go mieć?
jpkotta
@jpkotta, mam podwójny rozruch, każdy używa domyślnej ~/.emacs.d/elpa/lokalizacji pakietów. Jednak moja wersja kodu instalującego pakiet znajduje się na „trzeciej” partycji ( e:/emacs-configlub /e/emacs-config/). Dlatego dodaję pakiet do listy w jednym systemie operacyjnym i powinien zostać zaktualizowany, gdy załaduję Emacsw drugim systemie operacyjnym. Na pewno w moim rozwiązaniu jest element przesady, ale przynajmniej wydaje się, że działa.
Brady Trainor
@jpkotta, umyka mi powód, dla którego package-archive-contentswydawało mi się , że jestem tak niefortunny. To jest kwestia, której nie zawęziłem. Jeśli w przyszłości szukam i znajdę „bardziej eleganckie” rozwiązanie, to dodam je do mojego wpisu.
Brady Trainor
1
(package-refresh-contents)pisze do ~/.emacs.d/elpa/archives. Nie jest jasne, czy masz ten katalog współdzielony między systemami operacyjnymi. Odradzałbym udostępnianie elpa/katalogów, ponieważ kod bajtowy Emacsa (kod elpa/jest kompilowany przez bajtowanie) nie jest kompatybilny wstecz ( gnu.org/software/emacs/manual/html_node/elisp/… ). Musiałbyś upewnić się, że obie instalacje mają tę samą wersję Emacsa. Utrzymuję .emacs.dkontrolę wersji i synchronizuję z tym różne instalacje.
jpkotta