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)

패키지 설치 및 업데이트와 관련된 세 가지 질문이 있습니다.

Q1. 사용 가능한 패키지 목록 (및 최신 버전)을 업데이트하고 특정 패키지를 업데이트하는 방법이 있습니까?

Q.2 다음 패키지 소스의 차이점은 무엇입니까?

  • ELPA,
  • 암소 비슷한 일종의 영양
  • 마멀레이드
  • 멜파

Q.3 추가되는 순서가 중요합니까 package-archives?


13
MELPA는 자동 완성에 필요합니다. 왜냐하면 Marmalade에서 자동 완성 기능을 사용할 필요가 없었기 때문입니다. 귀찮게하지 말고 청소하십시오 package-archives. 더 이상 유지 관리되지 않는 ELPA 아카이브와 명확한 지침과 유지 관리없이 오래되고 중복 된 패키지의 엉망인 마멀레이드 아카이브를 제거하십시오. 표준 GNU 아카이브 만 사용하고 MELPA>
lunaryorn

2
감사합니다 @lunaryorn! 매우 도움이됩니다. 내가 이런 식으로 정보를 얻을 수있는 방법을 알고 있습니까? (즉, "좋은 물건 - 투 - 알고"이런 이맥스 진화 등)
아멜리오 바스케스 - 레이나

3
Reddit에서 / emacs를 따르고 Nic Ferrier, Bozhidar Batsov, Magnar Sveen, John Wiegley 등과 같은 유명한 Emacs 사람들의 블로그와 트위터를 따르십시오 .Freenode IRC에서 #emacs에 가입하십시오. 그리고 더 많은.
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무조건 추가 한 모든 저장소에서 패키지 목록을 다운로드하려고 시도합니다 package-archives. package-archive-contents이미 패키지 목록을 다운로드 한 경우 0이 아닙니다.

  2. ELPA 는 원본입니다. 더 이상 실제로 유지되지 않는다고 생각하지만 확실하지 않습니다. 나는 그것을 사용하지 않습니다.

    GNU 는 "공식"입니다. Emacs와 함께 유지 관리되므로 항상 작동하지만 업데이트 및 새 패키지가 자주 나오지 않습니다.

    마멀레이드 는 기본적으로 완전한 패키지를 업로드 할 수있는 웹 사이트이며 마멀레이드 리포지토리에 추가됩니다. 패키지의 업스트림에 대한 링크를 제출하지 않고 패키지 작성을 완전히 자동화하지는 않습니다. 업스트림을 추적하고 싶지는 않기 때문에 이것이 올바른 것이라고 생각합니다. 불행히도, 그것은 오랫동안 유지되지 않았지만 누군가가 최근에 그것을 인수하여 어느 시점에서 다시 돌아와야합니다.

    Melpa 는 EmacsWiki lisp 영역 또는 github 저장소와 같은 URL을 가져 와서 자동으로 패키지를 빌드합니다. 따라서 추적하는 것이 무엇이든 대개 하루가 지납니다. 그것이 업스트림을 추적하지만 실제로는 문제가 없었으며, 이것이 대부분의 패키지가 나온 곳입니다. Melpa StableMelpa 와 비슷하지만 최신 개정판 대신 업스트림 저장소의 태그 개정판을 가져옵니다. Melpa 안정은 Melpa보다 패키지가 적습니다.

    조직 모드 에는 자체 package.el저장소가 있습니다 ( http://orgmode.org/elpa/ ).

    모든 패키지 저장소는 동일하게 작동합니다 package-archives.

    다음 은이 주제에 대한 보다 심도 깊은 블로그 게시물 입니다.

  3. 확실하지 않지만 패키지가 다른 저장소에 복제되면 저장소가 표시되는 순서가 package-archives우선 순위 를 결정합니다. 높은 우선 순위가 목록의 시작 또는 끝에 있는지 모르겠습니다.

    업데이트 : Emacs 25에는 package-archive-priorities패키지 저장소의 우선 순위를 정하는 데 사용할 수 있는 변수 가 있습니다 (예 : ELPA보다 ELPA 선호).


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
알퍼

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를 새 컴퓨터에 복사하고 모든 패키지를 자동으로 설치하지만 그 후에 수동으로 업데이트해야한다는 것입니다. 약 2 주에 한 번씩 업데이트를 시도합니다. 목록에 패키지를 추가했다고 생각하지만 패키지 package-archive-contents가 너무 오래 되었습니까?
jpkotta

@ jpkotta, 나는 ~/.emacs.d/elpa/패키지의 위치에 각각 기본값 을 사용하는 듀얼 부팅이 있습니다. 그러나 내 패키지 설치 코드 버전은 "세 번째"파티션 ( e:/emacs-config또는 /e/emacs-config/)에 있습니다. 따라서 한 OS에서 패키지를 목록에 추가 Emacs하고 다른 OS에서 로드 할 때 업데이트해야합니다 . 확실히 내 솔루션에는 과잉 요소가 있지만 적어도 작동하는 것 같습니다.
Brady Trainor 2016 년

@ jpkotta, 왜 내가 가능하지 package-archive-contents않은 것처럼 보였을 까요? 그것은 내가 좁히지 않은 문제입니다. 앞으로 "보다 우아한"솔루션을 찾고 찾으면 내 게시물에 추가 할 것입니다.
Brady Trainor 2016 년

1
(package-refresh-contents)에 씁니다 ~/.emacs.d/elpa/archives. OS간에 해당 디렉토리가 공유되어 있는지 확실하지 않습니다. elpa/Emacs 바이트 코드 (코드는 바이트 컴파일 elpa/됨)는 하위 호환성 ( gnu.org/software/emacs/manual/html_node/elisp/… ) 이 아니기 때문에 디렉토리 공유를 권장 하지 않습니다 . 두 설치 모두 동일한 버전의 Emacs를 가지고 있는지 확인해야합니다. .emacs.d버전 관리를 유지 하고 다른 설치를 그와 동기화합니다.
jpkotta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.