การอัพเดทแพ็คเกจใน Emacs


144

ฉันมีการตั้งค่าต่อไปนี้สำหรับแพ็คเกจ (ไม่แน่ใจว่ามีสิ่งที่แนะนำดีกว่า):

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

ฉันมีคำถามสามข้อเกี่ยวกับการติดตั้งและอัปเดตแพ็คเกจ

ไตรมาสที่ 1 มีวิธีอัปเดตรายการแพ็กเกจที่มีอยู่ (และเวอร์ชันล่าสุด) และอัพเดตแพ็กเกจเฉพาะหรือไม่?

Q.2อะไรคือความแตกต่างระหว่างแหล่งแพ็กเกจต่อไปนี้:

  • ELPA,
  • GNU
  • แยมผิวส้ม
  • melpa

คำถามที่ 3มันมีความสำคัญต่อลำดับที่เพิ่มเข้าไปpackage-archivesหรือไม่?


13
MELPA เป็นสิ่งจำเป็นสำหรับการทำให้สมบูรณ์อัตโนมัติเนื่องจากเห็นได้ชัดว่าไม่มีใครใส่ใจที่จะทำให้การเติมเต็มอัตโนมัตินั้นมีอยู่ใน Marmalade ไม่รำคาญ package-archivesแต่ทำความสะอาดของคุณ กำจัดไฟล์เก็บถาวร ELPA ซึ่งไม่ได้รับการดูแลรักษาอีกต่อไปและไฟล์เก็บถาวรมาร์มาเลดซึ่งเป็นระเบียบของแพ็คเกจล้าสมัยและซ้ำซ้อนโดยไม่มีแนวทางและการบำรุงรักษาที่ชัดเจน ใช้เฉพาะไฟล์เก็บถาวร GNU มาตรฐานและ MELPA>
lunaryorn

2
ขอบคุณ @lunaryorn! มีประโยชน์มาก คุณรู้ไหมว่าฉันจะได้รับข่าวสารเกี่ยวกับสิ่งนี้ได้อย่างไร (เช่น "สิ่งดีที่ต้องรู้" เช่นนี้เมื่อ Emacs วิวัฒนาการ)
Amelio Vazquez-Reina

3
ข้อมูลไหลเวียนอยู่ในเว็บได้อย่างอิสระเพียงแค่ติดตาม: ติดตาม / emacs บน Reddit ติดตามบล็อกและทวีตของคนที่มีชื่อเสียงของ Emacs เช่น Nic Ferrier, Bozhidar Batsov, Magnar Sveen, John Wiegley, ฯลฯ เข้าร่วม #emacs บน Freenode IRC, และอื่น ๆ อีกมากมาย.
Lunaryorn

3
คุณควร(setq package-enable-at-startup nil)ถ้าคุณจะเรียก(package-initialize)ตัวเองว่า
phils

2
ขอบคุณ @phils - ทำไมจึงเป็นสิ่งจำเป็น
Amelio Vazquez-Reina

คำตอบ:


163
  1. ในการอัพเดตรายการแพ็กเกจโดยอัตโนมัติหากไม่มีรายการแพ็กเกจอยู่แล้วให้ใช้สิ่งต่อไปนี้:

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

    เพื่อที่จะปรับปรุงแพคเกจติดตั้งทุกชนิดpackage-list-packagesซึ่งจะพาคุณไปยัง*Packages*บัฟเฟอร์ (และยังปรับปรุงรายการของแพคเกจ) U xและจากนั้นพิมพ์

    package-refresh-contentsโดยไม่มีเงื่อนไขพยายามที่จะดาวน์โหลดรายการแพคเกจจาก Repos ทั้งหมดที่คุณได้เพิ่มให้กับpackage-archives; package-archive-contentsไม่ใช่ศูนย์ถ้าคุณดาวน์โหลดรายการแพคเกจไปแล้ว

  2. ELPAเป็นต้นฉบับ ฉันไม่คิดว่ามันจะได้รับการดูแลรักษาอีกต่อไป แต่ฉันไม่แน่ใจ ฉันไม่ได้ใช้มัน

    GNUคือ "เป็นทางการ" มันได้รับการบำรุงรักษาพร้อมกับ Emacs ซึ่งหมายความว่าสิ่งต่าง ๆ ควรทำงานได้ตลอดเวลา แต่การอัพเดตและแพ็คเกจใหม่ ๆ มักจะไม่เกิดขึ้นบ่อยนัก

    Marmaladeนั้นเป็นเว็บไซต์ที่คุณสามารถอัปโหลดแพคเกจที่สมบูรณ์และมันจะถูกเพิ่มไปยัง repo มาร์มาเลด คุณไม่เพียงแค่ส่งลิงค์ไปยังแพ็คเกจต้นน้ำและมันก็ไม่ได้ทำให้การสร้างแพคเกจสมบูรณ์แบบอัตโนมัติ ฉันคิดว่านี่เป็นสิ่งที่ถูกต้องเพราะคุณไม่จำเป็นต้องติดตามต้นน้ำ น่าเสียดายที่มันไม่ได้ถูกทำลายไปซักพักแล้ว แต่เมื่อเร็ว ๆ นี้มีคนเข้ามาดังนั้นจึงควรกลับมาและดีขึ้นในบางจุด

    Melpaนำ URL ไปใช้เช่นพื้นที่ EmacsWiki lisp หรือ gitub repo และสร้างแพ็คเกจจากมันโดยอัตโนมัติ ดังนั้นโดยปกติแล้วจะใช้เวลาไม่เกินหนึ่งวันในการติดตาม แม้ว่าแทร็กจะอัปสตรีม แต่ฉันไม่เคยมีปัญหาในทางปฏิบัติและนี่คือที่มาของแพ็คเกจส่วนใหญ่ของฉัน นอกจากนี้ยังมีMelpa Stableซึ่งเป็นเหมือน Melpa แต่คว้าแท็กการแก้ไขของ repo ต้นน้ำแทนการแก้ไขล่าสุด Melpa เสถียรมีแพ็คเกจน้อยกว่า Melpa

    โหมดองค์กรมีpackage.elrepo ของตนเอง( http://orgmode.org/elpa/ )

    ทั้งหมด Repos package-archivesแพคเกจการทำงานเดียวกันคุณก็เพิ่มให้คุณ

    นี่คือบล็อกโพสต์เชิงลึกเพิ่มเติมเกี่ยวกับเรื่องนี้ซึ่งฉันส่วนใหญ่เห็นด้วย

  3. ฉันไม่แน่ใจ แต่ฉันคิดว่าถ้ามีการทำซ้ำแพคเกจใน repos ที่แตกต่างกันลำดับของ repos ที่ปรากฏในpackage-archivesกำหนดลำดับความสำคัญ ฉันไม่ทราบว่าลำดับความสำคัญที่สูงกว่าอยู่ที่จุดเริ่มต้นหรือจุดสิ้นสุดของรายการ

    อัปเดต: ใน Emacs 25 มีตัวแปรpackage-archive-prioritiesที่คุณสามารถใช้เพื่อจัดลำดับความสำคัญของแพคเกจ repos ของคุณ (เช่นชอบ ELPA มากกว่า MELPA)


นี่คือส่วนที่เกี่ยวข้องของฉันinit.elหากคุณสนใจ:

(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
ขอบคุณ! สิ่งที่ไม่when (not package-archive-contents)ตรวจสอบ?
Amelio Vazquez-Reina

3
เงื่อนไขป้องกันการรีเฟรชทุกครั้งที่ฉันเริ่ม emacs (ฉันมักต้องการให้ตรวจสอบเมื่อฉันบอกเท่านั้น) มันจะตรวจสอบเฉพาะในกรณีที่ไม่มีคลังเก็บแพคเกจซึ่งควรจะเป็นกรณีที่ครั้งแรกที่ฉันโคลนการกำหนดค่าของฉันไปยังเครื่องใหม่
jpkotta

เพียงแจ้งให้คุณทราบถึงคำตอบของ @Brandy Trainor ซึ่งดูเหมือนจะเติมเต็มคำตอบของคุณ - ในกรณีที่เป็นประโยชน์
Amelio Vazquez-Reina

ฉันคิดว่าสิ่งนี้ต้องเรียก(refresh-package-contents)อย่างไม่มีเงื่อนไขก่อนที่จะดาวน์โหลดแพ็คเกจใหม่มิฉะนั้น Emacs อาจลองดาวน์โหลดแพ็คเกจรุ่นเก่า (ซึ่งก็คือ 404) ล้มเหลวและหยุดโหลด
Vladimir Panteleev

วิธีที่ดีที่สุดในการทำความเข้าใจกับแพ็คเกจที่ไม่ต้องการคืออะไร? @jpkotta
Alper

103

ภายใน Emacs ใช้M-x list-packagesเพื่อแสดงรายการแพ็คเกจทั้งหมดซึ่งจะรีเฟรชเนื้อหาที่เก็บถาวรโดยอัตโนมัติ หลังจากนั้นใช้Uเพื่อทำเครื่องหมายแพ็คเกจอัพเกรดที่สามารถอัพเกรดได้ทั้งหมดและxเพื่อดำเนินการอัพเดตใหม่ Emacs จะดึงข้อมูลและติดตั้งการอัปเกรดทั้งหมดและถามคุณว่าจะลบเวอร์ชันเก่าและล้าสมัยในภายหลังหรือไม่

คุณอาจต้องการดูที่Cartonซึ่งเป็นวิธีที่สะดวกกว่าในการจัดการแพ็คเกจของคุณโดยการประกาศในไฟล์เฉพาะและรวมถึงไคลเอนต์บรรทัดคำสั่งที่สะดวกในการติดตั้งและอัปเกรดแพ็กเกจที่ประกาศด้วยวิธีนี้โดยอัตโนมัติ


คำสั่งของpackage-archivesไม่ได้เรื่อง Emacs package-archive-contentsรวบรวมเนื้อหาของคลังข้อมูลทั้งหมดลงในรายการที่เชื่อมโยงกันเดียวของแพคเกจใช้ได้และรุ่นของพวกเขาเก็บไว้ใน

เมื่อpackage-installEmacs จะเลือกแพ็คเกจรุ่นใหม่ล่าสุดโดยไม่คำนึงถึงแหล่งเก็บถาวร สำหรับการควบคุมเพิ่มเติมเกี่ยวกับที่มาของแพ็คเกจ MELPA จัดเตรียมแพ็คเกจ melpaที่อนุญาตให้ใช้แพคเกจขาวดำหรือรายการที่อนุญาตจากคลังเก็บที่ระบุ


2
นั่นS-uจะแม่นยำมากขึ้น
Lenar Hoyt

@mcb อะไรS-u? เมนูแพ็คเกจไม่ได้ใช้การเชื่อมโยงนั้น
Lunaryorn

2
ฉันหมายความShift-uว่าอย่างนั้น
Lenar Hoyt

8
@mcb นั่นคือเหตุผลที่ฉันเขียนเมืองหลวง U 😊
lunaryorn

1
สำหรับคนที่สับสนเช่นฉันที่คิดว่านี่หมายถึง <kbd> U </kbd>
Lenar Hoyt

23

ในอาคารผู้โดยสาร:

emacs

M-x list-packages

สิ่งนี้จะนำคุณเข้าสู่บัฟเฟอร์ * packages *

shift-u x

emacs จะถามคุณ (y / n) รอการอัพเดท

C-x k <ret>

สิ่งนี้จะฆ่าบัฟเฟอร์ * packages * และนำคุณกลับไปที่ * scratch *

C-x-C-c

สิ่งนี้จะออกจาก emacs และให้คุณเปิดใหม่อีกครั้ง แต่คุณอาจต้องแก้ไขข้อบกพร่อง:

emacs

2 ¢ของฉัน


ฉันได้“ ไม่ระบุคำสั่ง” หรืออะไรทำนองนั้นเมื่อฉันพิมพ์“ U” หลังจากทำงานM-x package-refresh-contentsฉันได้รับแจ้งให้พิมพ์“ U” เพื่อทำเครื่องหมายว่าอัปเดตทั้งหมดแล้วฉันสามารถพิมพ์“ x” เพื่อเรียกใช้การอัปเดตได้
MrColes

2

นี่เป็นความคิดเห็นเพิ่มเติมเกี่ยวกับคำตอบของ jpkotta

นี่คือการปรับที่ฉันกำลังทดลองกับคำตอบของ jpkotta ด้านบน:

(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

(แทนที่(when (not package-archive-contents) (package-refresh-contents)))

รายการแพ็กเกจไม่รีเฟรชอย่างเพียงพอบ่อยครั้งสำหรับการใช้งานของฉัน

ฉันไม่ได้พิจารณาว่าจะมีวิธีแก้ไขปัญหาที่มีประสิทธิภาพมากกว่านี้หรือไม่ ก่อนอื่นฉันต้องดูว่าปัญหาจะหายไปจากการปรับนี้หรือไม่


ในคำตอบของฉันpackage-archive-contentsจะรีเฟรชเฉพาะถ้ามันไม่อยู่ แนวคิดคือให้คุณคัดลอก. emacs.d ไปยังเครื่องใหม่และจะติดตั้งแพ็คเกจทั้งหมดโดยอัตโนมัติ แต่หลังจากนั้นคุณต้องอัปเดตด้วยตนเอง ฉันพยายามอัปเดตทุกสองสัปดาห์ ฉันคาดเดาว่าคุณได้เพิ่มแพ็คเกจลงในรายการของคุณ แต่คุณpackage-archive-contentsแก่เกินไปที่จะมีหรือไม่
jpkotta

@ jpkotta ฉันมีบูตคู่โดยแต่ละอันใช้ค่าเริ่มต้น~/.emacs.d/elpa/สำหรับตำแหน่งของแพคเกจ อย่างไรก็ตามแพ็คเกจติดตั้งรหัสเวอร์ชันของฉันอยู่ในพาร์ติชั่น "สาม" ( e:/emacs-configหรือ/e/emacs-config/) ดังนั้นฉันจึงเพิ่มแพ็คเกจไปยังรายการในขณะที่อยู่ในระบบปฏิบัติการหนึ่งและควรอัปเดตเมื่อฉันโหลดEmacsในระบบปฏิบัติการอื่น แน่นอนว่ามีองค์ประกอบบางส่วนของ overkill ในโซลูชันของฉัน แต่ดูเหมือนว่าจะทำงานได้อย่างน้อย
Brady Trainor

@jpkotta ทำไมpackage-archive-contentsดูเหมือนว่าฉันจะเป็นเพราะฉันขาดความสามารถ นั่นเป็นปัญหาที่ฉันไม่ได้แคบลง หากฉันมองหาและหาทางออก "ที่หรูหรากว่า" ในอนาคตฉันจะเพิ่มไปยังโพสต์ของฉัน
Brady Trainor

1
(package-refresh-contents)~/.emacs.d/elpa/archivesเขียนไป ไม่ชัดเจนหากคุณมีไดเรกทอรีนั้นที่ใช้ร่วมกันระหว่างระบบปฏิบัติการ ผมอยากแนะนำให้กับร่วมกันelpa/ไดเรกทอรีเพราะ Emacs bytecode (รหัสelpa/เป็น bytecompiled) ไม่รองรับหลัง ( gnu.org/software/emacs/manual/html_node/elisp/... ) คุณต้องตรวจสอบให้แน่ใจว่าการติดตั้งทั้งสองนั้นมี Emac รุ่นเดียวกัน ฉัน.emacs.dใช้การควบคุมเวอร์ชันและซิงโครไนซ์การติดตั้งที่แตกต่างกับสิ่งนั้น
jpkotta
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.