Cập nhật các gói trong Emacs


144

Tôi có các thiết lập sau cho các gói (không chắc có gói nào được đề xuất tốt hơn không):

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

Tôi có ba câu hỏi liên quan đến việc cài đặt và cập nhật các gói.

Q1. Có cách nào để cập nhật danh sách các gói có sẵn (và các phiên bản mới nhất) và cập nhật một gói cụ thể không?

Q.2 Sự khác biệt giữa các nguồn gói sau đây là gì?:

  • EL PA,
  • GNU
  • mứt
  • melpa

Q.3 Có vấn đề gì về thứ tự mà chúng được thêm vào package-archiveskhông?


13
MELPA là cần thiết để tự động hoàn thành vì rõ ràng không ai bận tâm để tự động hoàn thành có sẵn trên Marmalade. Đừng bận tâm, mà là dọn dẹp của bạn package-archives. Loại bỏ kho lưu trữ ELPA, không còn được duy trì nữa và kho lưu trữ marmalade, một mớ hỗn độn của các gói lỗi thời và trùng lặp mà không có hướng dẫn và bảo trì rõ ràng. Chỉ sử dụng kho lưu trữ GNU tiêu chuẩn và MELPA>
lunaryorn

2
Cảm ơn @lunaryorn! Điều đó rất hữu ích. Bạn có biết làm thế nào tôi có thể được thông báo về những thứ như thế này? (tức là "những điều cần biết" như thế này khi Emacs phát triển)
Amelio Vazquez-Reina

3
Thông tin được tự do lưu chuyển trên web, chỉ cần nắm bắt: Theo dõi / emacs trên Reddit, theo dõi blog và twitter của những người Emacs nổi tiếng như Nic Ferrier, Bozhidar Batsov, Magnar Sveen, John Wiegley, v.v., tham gia #emacs trên Freenode IRC, và nhiều thứ khác nữa.
lunaryorn

3
Bạn nên (setq package-enable-at-startup nil)gọi (package-initialize)cho mình.
phils

2
Cảm ơn @phils - Tại sao cần thiết?
Amelio Vazquez-Reina

Câu trả lời:


163
  1. Để tự động cập nhật danh sách các gói, chỉ khi chưa có danh sách gói , hãy sử dụng như sau:

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

    Để cập nhật tất cả các gói đã cài đặt, hãy nhập package-list-packages, sẽ đưa bạn đến *Packages*bộ đệm (và cũng cập nhật danh sách các gói), sau đó nhập U x.

    package-refresh-contentscố gắng vô điều kiện để tải xuống một danh sách gói từ tất cả các repos bạn đã thêm vào package-archives; package-archive-contentskhông phải là không nếu bạn đã tải xuống danh sách gói.

  2. ELPA là bản gốc. Tôi không nghĩ rằng nó thực sự được duy trì nữa, nhưng tôi không chắc chắn. Tôi không sử dụng nó.

    GNU là "chính thức". Nó được duy trì cùng với Emacs, có nghĩa là mọi thứ sẽ luôn hoạt động nhưng các bản cập nhật và gói mới không đến thường xuyên.

    Marmalade về cơ bản là một trang web nơi bạn có thể tải lên một gói hoàn chỉnh, và nó sẽ được thêm vào repo marmalade. Bạn không chỉ gửi một liên kết đến thượng nguồn của gói và nó không hoàn toàn tự động hóa việc tạo gói hoàn toàn. Tôi nghĩ rằng đây là điều đúng, bởi vì bạn không nhất thiết muốn theo dõi ngược dòng. Thật không may, nó đã không được biết đến trong một thời gian, nhưng một số người gần đây đã tiếp nhận nó để nó sẽ trở lại và tốt hơn tại một số điểm.

    Melpa lấy một URL để ví dụ khu vực lisp EmacsWiki hoặc repo github và tự động xây dựng một gói từ nó. Do đó, nó thường chậm hơn một ngày so với bất cứ thứ gì nó đang theo dõi. Mặc dù nó theo dõi ngược dòng, tôi chưa bao giờ gặp vấn đề trong thực tế và đây là nơi hầu hết các gói của tôi đến từ. Ngoài ra còn có Melpa Stable , giống như Melpa nhưng lấy các phiên bản được gắn thẻ của repo ngược dòng thay vì phiên bản mới nhất. Melpa ổn định có ít gói hơn Melpa.

    Chế độ Orgpackage.elrepo riêng ( http://orgmode.org/elpa/ ).

    Tất cả các repos gói đều hoạt động như nhau, bạn chỉ cần thêm chúng vào package-archives .

    Đây là một bài viết blog sâu hơn về chủ đề này, mà tôi hầu hết đồng ý với.

  3. Tôi không chắc chắn, nhưng tôi nghĩ rằng nếu một gói được sao chép trong các repos khác nhau, thứ tự các repos xuất hiện trong package-archives xác định quyền ưu tiên. Tôi không biết nếu ưu tiên cao hơn là ở đầu hoặc cuối danh sách.

    Cập nhật: Trong Emacs 25, có một biến package-archive-prioritiesmà bạn có thể sử dụng để ưu tiên repos gói của mình (ví dụ: thích ELPA hơn MELPA).


Đây là phần có liên quan của tôi init.el, nếu bạn quan tâm:

(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
Cảm ơn! Làm những gì when (not package-archive-contents)kiểm tra?
Amelio Vazquez-Reina

3
Các điều kiện ngăn chặn làm mới mỗi khi tôi bắt đầu emacs (tôi thường chỉ muốn kiểm tra khi tôi nói với nó). Nó chỉ kiểm tra nếu không có kho lưu trữ gói, đó chỉ là trường hợp lần đầu tiên tôi sao chép cấu hình của mình vào một máy mới.
jpkotta

Chỉ cần cho bạn biết câu trả lời của @Brandy Trainor, dường như bổ sung cho câu trả lời của bạn - trong trường hợp nó hữu ích.
Amelio Vazquez-Reina

Tôi nghĩ rằng điều này cần phải gọi (refresh-package-contents)vô điều kiện trước khi tải xuống các gói mới, vì nếu không, Emacs có thể thử tải xuống một phiên bản gói cũ (lúc đó là 404), thất bại và ngừng tải.
Vladimir Panteleev

Cách tốt nhất để hiểu gói nào là không mong muốn? @jpkotta
alper

103

Trong Emacs, sử dụng M-x list-packagesđể liệt kê tất cả các gói sẽ tự động làm mới nội dung lưu trữ. Sau đó sử dụng Uđể đánh dấu tất cả các gói có thể nâng cấp sẽ được nâng cấp vàx thực sự thực hiện các bản cập nhật mới. Emacs sau đó sẽ tìm nạp và cài đặt tất cả các nâng cấp, và hỏi bạn xem có nên gỡ bỏ các phiên bản cũ, lỗi thời sau đó không.

Bạn cũng có thể xem qua Thùng cung cấp một cách thuận tiện hơn để quản lý các gói của bạn bằng cách khai báo chúng trong một tệp chuyên dụng và bao gồm một máy khách dòng lệnh thuận tiện để tự động cài đặt và nâng cấp các gói được khai báo theo cách này.


Trình tự package-archiveskhông không thành vấn đề. Emacs tổng hợp nội dung của tất cả các tài liệu lưu trữ thành một danh sách thống nhất các gói có sẵn và các phiên bản của chúng, được lưu trữ trong package-archive-contents.

Khi đó package-install, Emacs sẽ chỉ chọn phiên bản mới nhất của gói, bất kể kho lưu trữ ban đầu. Để kiểm soát nhiều hơn về nguồn gốc gói, MELPA cung cấp gói melpa cho phép các gói đen hoặc danh sách trắng từ kho lưu trữ được chỉ định.


2
Điều đó S-uchính xác hơn.
Lenar Hoyt

@mcb là gì S-u? Menu gói không sử dụng ràng buộc đó.
lunaryorn

2
Ý tôi là Shift-uvì điều đó.
Lenar Hoyt

8
@mcb Chà, đó là lý do tại sao tôi viết một thủ đô U 😊
lunaryorn

1
Chỉ dành cho những người bối rối như tôi nghĩ rằng điều này có nghĩa là <kbd> U </ kbd>.
Lenar Hoyt

23

Trong thiết bị đầu cuối:

emacs

M-x list-packages

điều này đặt bạn vào bộ đệm * gói *

shift-u x

emacs sẽ hỏi bạn (y / n), chờ cập nhật

C-x k <ret>

việc này sẽ giết bộ đệm * gói * và đưa bạn trở lại * cào *

C-x-C-c

điều này sẽ thoát emacs và cho phép bạn khởi chạy lại, nhưng bạn có thể phải gỡ lỗi :(

emacs

2 của tôi


Tôi đã nhận được lệnh mà không có lệnh nào được chỉ định, hoặc một cái gì đó tương tự khi tôi gõ vào U U. Sau khi chạy M-x package-refresh-contents, nó nhắc tôi nhập vào kiểu chữ Uv để đánh dấu tất cả để cập nhật, và sau đó tôi có thể gõ chữ "x x" để chạy các bản cập nhật.
MrColes

2

Đây là nhiều hơn một nhận xét mở rộng về câu trả lời của jpkotta.

Đây là một điều chỉnh mà tôi đang thử nghiệm cho câu trả lời của jpkotta ở trên:

(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

(thay thế (when (not package-archive-contents) (package-refresh-contents)) ).

Danh sách gói không được làm mới đủ thường xuyên cho trường hợp sử dụng của tôi.

Tôi đã không cân nhắc nếu có một giải pháp hiệu quả hơn cho vấn đề của mình; Đầu tiên, tôi sẽ xem liệu vấn đề có biến mất với sự điều chỉnh này không.


Trong câu trả lời của tôi, chỉ package-archive-contentsđược làm mới nếu nó không tồn tại. Ý tưởng là bạn sao chép .emacs.d của bạn sang một máy mới và nó sẽ tự động cài đặt tất cả các gói của bạn, nhưng sau đó bạn phải cập nhật thủ công. Tôi cố gắng cập nhật khoảng hai tuần một lần. Tôi đoán bạn đã thêm một gói vào danh sách của bạn, nhưng bạn package-archive-contentsđã quá già để có nó?
jpkotta

@jpkotta, tôi có một khởi động kép, mỗi lần sử dụng mặc định của chúng ~/.emacs.d/elpa/cho vị trí của các gói. Tuy nhiên, phiên bản mã cài đặt gói của tôi nằm trong phân vùng "thứ ba", ( e:/emacs-confighoặc /e/emacs-config/). Vì vậy, tôi thêm một gói vào danh sách trong khi ở một HĐH và nó sẽ cập nhật khi tôi tải Emacstrong HĐH khác. Để chắc chắn có một số yếu tố quá mức trong giải pháp của tôi, nhưng nó dường như đang hoạt động ít nhất.
Brady Trainor

@jpkotta, tại sao package-archive-contentsdường như tôi có thể thoát ra khỏi tôi. Đó là một vấn đề tôi đã không thu hẹp. Nếu tôi tìm kiếm và tìm một giải pháp "thanh lịch hơn" trong tương lai, tôi sẽ thêm nó vào bài viết của mình.
Brady Trainor

1
(package-refresh-contents)viết cho ~/.emacs.d/elpa/archives. Không rõ nếu bạn có thư mục đó được chia sẻ giữa các hệ điều hành. Tôi khuyên bạn không nên chia sẻ các elpa/thư mục, bởi vì mã byte của Emacs (mã trong elpa/là bytecompiled) không tương thích ngược ( gnu.org/software/emacs/manual/html_node/elisp/ trộm ). Bạn phải đảm bảo rằng cả hai bản cài đặt có cùng phiên bản Emacs. Tôi giữ .emacs.dquyền kiểm soát phiên bản của mình và đồng bộ hóa các cài đặt khác nhau với điều đó.
jpkotta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.