Emacs'ta paketleri güncelleme


144

Paketler için aşağıdaki kurulum var (daha iyi bir önerilen olup olmadığından emin değilim):

(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)

Paketlerin yüklenmesi ve güncellenmesi ile ilgili üç sorum var.

S1. Kullanılabilir paketlerin listesini (ve en son sürümleri) güncellemenin ve belirli bir paketi güncellemenin bir yolu var mı?

S.2 Aşağıdaki paket kaynakları arasındaki fark nedir ?:

  • ELPA,
  • GNU
  • marmelat
  • melpa

S.3 Eklenme sırası önemli package-archivesmi?


13
Otomatik tamamlama için MELPA'ya ihtiyaç duyulmaktadır, çünkü Marmalade'de otomatik tamamlamayı sağlamak için hiçbiri rahatsız edilmemektedir. Rahatsız etmeyin, daha ziyade temizleyin package-archives. Artık korunmayan ELPA arşivinden ve açık bir rehberlik ve bakım gerektirmeyen eski ve çoğaltılmış paketlerin bir karmaşası olan marmelat arşivinden kurtulun. Yalnızca standart GNU arşivini ve MELPA>
lunaryorn

2
Teşekkürler @lunaryorn! Bu çok yardımcı oldu. Böyle şeylerden nasıl haberdar olabileceğimi biliyor musunuz? (yani Emacs geliştikçe "iyi bilinen şeyler" gibi)
Amelio Vazquez-Reina

3
Bilgiler web'de özgürce akıyor, sadece yakalayın: Reddit'i takip edin / emacs yapın, blogları takip edin ve Nic Ferrier, Bozhidar Batsov, Magnar Sveen, John Wiegley, vb. ve daha fazlası.
lunaryorn

3
Kendinizi (setq package-enable-at-startup nil)arayacaksanız yapmalısınız (package-initialize).
phils

2
Teşekkürler @phils - Neden gerekli?
Amelio Vazquez-Reina

Yanıtlar:


163
  1. Paket listesini otomatik olarak güncellemek için, yalnızca paket listesi yoksa aşağıdakileri kullanın:

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

    Yüklü tüm paketleri güncellemek package-list-packagesiçin, sizi *Packages*arabelleğe götürecek (ve ayrıca paket listesini güncelleyecek) yazın ve yazın U x.

    package-refresh-contentskoşulsuz olarak eklediğiniz tüm depolardan bir paket listesi indirmeye çalışır package-archives; package-archive-contentspaket listesini önceden indirdiyseniz nil değildir.

  2. ELPA orijinaldir. Artık gerçekten bakıldığını sanmıyorum, ama emin değilim. Ben kullanmıyorum.

    GNU "resmi" dir. Emacs ile birlikte korunur, bu da her şeyin çalışması gerekir, ancak güncellemeler ve yeni paketler çok sık gelmez.

    Marmalade temel olarak tam bir paket yükleyebileceğiniz bir web sitesidir ve marmelat deposuna eklenecektir. Sadece paketin yukarı akışına bir bağlantı göndermezsiniz ve paketin oluşturulmasını tamamen otomatik hale getirmez. Bence bu doğru bir şey, çünkü yukarı akış izlemek zorunda değilsiniz. Ne yazık ki, bir süredir bakımsız, ancak birisi yakın zamanda devraldı, bu yüzden bir noktada geri ve daha iyi olmalı.

    Melpa , EmacsWiki lisp alanına veya github deposuna bir URL alır ve bu paketten otomatik olarak bir paket oluşturur. Bu nedenle izlediklerinin genellikle bir gün gerisindedir. Her ne kadar akış yukarı izlese de, pratikte hiçbir zaman sorun yaşamadım ve paketlerimin çoğu burada. Melpa'ya benzeyen Melpa Stable da var, ancak en son revizyon yerine yukarı yönlü repodaki revizyonları etiketledi. Melpa ahırının Melpa'dan daha az paketi vardır.

    Kuruluş modunun kendi package.elrepoları vardır ( http://orgmode.org/elpa/ ).

    Tüm paket depoları aynı şekilde çalışır, sadece onları ekleyin package-archives.

    İşte bu konuyla ilgili daha derinlemesine anlaştığım daha ayrıntılı bir blog yazısı .

  3. Emin değilim, ama eğer bir paket farklı depolarda çoğaltılırsa, depoların içinde göründüğü sıra package-archivesönceliği belirler. Daha yüksek önceliğin listenin başında mı yoksa sonunda mı olduğunu bilmiyorum.

    Güncelleme: Emacs 25'te, package-archive-prioritiespaket depolarınıza öncelik vermek için kullanabileceğiniz bir değişken vardır (örneğin, MELPA yerine ELPA'yı tercih edin).


İşte Sesimin ilgili bölümdür init.elEğer ilgileniyorsanız,:

(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))))

2
Teşekkürler! Neleri when (not package-archive-contents)kontrol eder?
Amelio Vazquez-Reina

3
Koşullu, emacs'ı her başlattığımda yenilenmeyi önler (genellikle sadece bunu söylediğimde kontrol etmesini isterim). Yalnızca paket arşivleri olup olmadığını kontrol eder, bu sadece yapılandırmamı yeni bir makineye ilk kez kopyaladığımda olması gereken durumdur.
jpkotta

@Brandy Trainor'un cevabınızı tamamlayıcı gibi görünen cevabını bilmeniz - yardımcı olması durumunda.
Amelio Vazquez-Reina

Bunun (refresh-package-contents)yeni paketler indirmeden önce koşulsuz olarak çağırması gerektiğini düşünüyorum , aksi takdirde Emacs eski bir paket sürümünü (o zamana kadar bir 404) indirmeyi deneyebilir, başarısız olabilir ve yüklemeyi durdurabilir.
Vladimir Panteleev

Hangi paketin istenmeyen olduğunu anlamanın en iyi yolu nedir? @jpkotta
alper

103

Emacs içinde M-x list-packages, arşiv içeriğini otomatik olarak yenileyecek tüm paketleri listelemek için kullanın . Daha sonra Uyükseltilecek tüm yükseltilebilir paketleri işaretlemek ve xgerçekte yeni güncellemeleri gerçekleştirmek için kullanın. Emacs daha sonra tüm yükseltmeleri alır ve yükler ve daha sonra eski, eski sürümleri kaldırıp kaldırmayacağınızı sorar.

Ayrıca , paketlerinizi özel bir dosyada bildirerek yönetmenin daha kolay bir yolunu sunan ve bu şekilde bildirilen paketleri otomatik olarak yüklemek ve yükseltmek için uygun bir komut satırı istemcisi içeren Carton'a da bakmak isteyebilirsiniz .


Sırası package-archivesyok değil önemli. Emacs, tüm arşivlerin içeriğini, içinde saklanan tek bir tutarlı paket listesi ve bunların sürümleri halinde toplar package-archive-contents.

Üzerine package-install, Emacs basitçe ne olursa olsun kaynak arşivin, bir paketin yeni sürümü seçecektir. Paketin kökeni hakkında daha fazla kontrol için, MELPA, paketleri belirtilen arşivlerden kara veya beyaz listeye almayı sağlayan melpa paketini sağlar.


2
En Yani S-udaha kesin konuşmak gerekirse.
Lenar Hoyt

@mcb Nedir S-u? Paket menüsü bu ciltlemeyi kullanmaz.
lunaryorn

2
Bununla demek istiyorum Shift-u.
Lenar Hoyt

8
@mcb Peki, bu yüzden büyük bir sermaye yazdım U 😊
lunaryorn

1
Sadece benim gibi şaşkın olanlar için bunun <kbd> U </kbd> anlamına geldiğini düşünüyorum.
Lenar Hoyt

23

Terminalde:

emacs

M-x list-packages

bu sizi * paketleri * tamponuna koyar

shift-u x

emacs sizden soracak (y / n), güncellemeleri bekleyecek

C-x k <ret>

bu, * Packages * buffer'ı öldürecek ve sizi * scratch * 'a geri döndürecektir.

C-x-C-c

bu emac'lardan çıkar ve yeniden başlatmanıza izin verir, ancak hata ayıklamanız gerekebilir :(

emacs

benim 2 ¢


“U” yazdığımda “komut belirtilmedi” ya da buna benzer bir şey aldım. Çalıştırdıktan sonra M-x package-refresh-contents, bu güncelleme için tüm işaretlemek için “U” tipi beni istenir, sonra güncelleştirmeleri çalıştırmak için “x” yazmak başardı.
MrColes

2

Bu daha çok jpkotta'nın cevabı hakkında genişletilmiş bir yorum.

Bu yukarıdaki jpkotta cevabı için denediğim bir düzenleme:

(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

(değiştirerek (when (not package-archive-contents) (package-refresh-contents))).

Paket listesi kullanım durumum için yeterince sık yenilenmiyordu.

Sorunum için daha etkili bir çözüm olup olmadığını düşünmedim; ilk olarak, sorunun bu ayarlama ile giderilip giderilmediğini görmeliyim.


Benim cevap olarak, package-archive-contentsbu yoksa yalnızca yenilenir. Fikir, .emacs.d dosyanızı yeni bir makineye kopyalamanız ve otomatik olarak tüm paketlerinizi yüklemenizdir, ancak bundan sonra manuel olarak güncellemeniz gerekir. Yaklaşık iki haftada bir güncellemeye çalışıyorum. Sanırım listene bir paket ekledin, ama package-archive-contentssahip olmak için çok yaşlı mıydın?
jpkotta

@jpkotta, çift önyükleme var, her ~/.emacs.d/elpa/biri paketlerin konumu için varsayılanlarını kullanıyor . Ancak, paket kurulum kodunuzun sürümü "üçüncü" bir bölümde ( e:/emacs-configveya /e/emacs-config/). Bu yüzden bir işletim sistemindeyken listeye bir paket ekliyorum Emacsve diğer işletim sistemine yüklediğimde güncellenmesi gerekiyor . Kesinlikle benim çözümümde bir miktar aşırılık var, ama en azından çalışıyor gibi görünüyor.
Brady Trainor

@jpkotta, neden package-archive-contentsbu kadar çılgınlıktan uzak görünüyorsun beni kaçıyor. Bu daralmadığım bir konu. Gelecekte "daha zarif" bir çözüm arar ve bulursam, bunu yazıma ekleyeceğim.
Brady Trainor

1
(package-refresh-contents)yazar ~/.emacs.d/elpa/archives. Bu dizinin işletim sistemleri arasında paylaşılıp paylaşılmadığı belli değil. elpa/Emacs bayt kodu (kod elpa/bytecompiled) geriye dönük olarak uyumlu olmadığı için dizinleri paylaşmamanızı tavsiye ederim ( gnu.org/software/emacs/manual/html_node/elisp/… ). Her iki kurulumun da Emacs'ın aynı sürümüne sahip olduğundan emin olmanız gerekir. .emacs.dSürümümü kontrol altında tutuyorum ve farklı kurulumları bununla senkronize ediyorum .
jpkotta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.