package.el을 사용하여 설치 및 업데이트하지만로드 및 구성을위한 use-package


15

최근에 대해 알게 된 후에 use-package구성을 이식하기로 결정했지만 package.el패키지 설치 및 사용의 편리 성을 포기하는 것을 꺼려했습니다 . use-package와 결합하기가 약간 까다 롭습니다 package.el.

나는 일반적으로 사람들 use-packagepackage.el시스템 과 결합하는 방법을 배우는 데 관심이 있지만 더 구체적인 질문은 계속 읽으십시오.

내가 원하는 것은 다음과 같습니다.

  1. 패키지 관리자가 패키지를 설치하여 패키지를 쉽게 찾아보고 업데이트 할 수 있도록합니다 list-packages.
  2. 를 통해 독점적으로 패키지를 구성하고로드하기 위해 use-packageinit 파일에서로드중인 내용과 구성 방법을 쉽게 볼 수 있습니다.
  3. 선택적으로 use-package:ensure키워드를 통해 패키지를 설치할 수도 있습니다 .

내가 올바르게 이해하고 있다면 package-initialize기본적으로 설정하는 방식 만 수행하는 것을 거의 원하지 않습니다 load-path. 현재 내 구성 에이 기능이 있습니다.

;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
  (normal-top-level-add-subdirs-to-load-path))
(require 'use-package)

주석이 달린 첫 번째 줄은 Emacs 25가 (package-initialize)내 init 파일에 유용하게 추가하지 않는다는 것 입니다. 비트 는을 만드는 normal-top-level-add-subdirs-to-load-path것에 대한 근사치이며 근사치로 충분합니다.package-initializeload-path

이것은 내 욕구 1과 2를 달성하는 것으로 보이지만 3 은 아닙니다. 사용하려고하면 초기화되지 않았다는 :ensure오류 메시지가 나타납니다 package.el. 호출 package-initialize하면 문제가 해결되지만 a) 모든 무수한 자동로드를로드하지 않기를 원합니다 (필요한 자동로드 use-package를 정확하게 생성 하는 데 선호 ) 및 b) 쉽게 할 수 있기를 원합니다. 원할 때마다 설치된 특정 패키지를로드하지 마십시오 (쉽게 수행 할 수 있음 use-package).

누구 든지이 작업을 수행하는 방법에 대한 권장 사항이 있습니까?

답변:


11

IIUC 당신이하고 싶은 것은 :

(package-initialize t)

t설치된 모든 패키지를 활성화하지 않고 package.el을 초기화 (또는 최소한)해야하므로 여기서 행복의 열쇠 인 인수에 주목하십시오 .


1
지금 package-initialize은 내 질문을 어리석게 만드는 것에 대해 기울고 있지만 내 질문에 대답 합니다.
Omar

15

현재 구성에서는 패키지 관리자를 초기화하지 않고 Emacs가 자동으로 초기화하지 않도록 package.el을 효과적으로 비활성화 했습니다. 그 대가로 ELPA를에 추가하는 load-path것이지만 package.el이하는 일의 작은 부분 일뿐입니다. 왜 그렇게하는지 잘 모르겠지만 권장하는 설정은 아닙니다.

특히, 접근 방식으로 패키지 자동로드를 얻지 못하므로 처음에는 어떤 패키지의 명령도 사용할 수 없습니다.

즉, M-x기본 제공 명령 만 제공합니다. 당신의 패키지의 명령에 추가하려면 당신이 명시 적으로 추가해야 할 것 :commands으로 정의를 모든 사용자 use-packageA와 금액, 이는 선언 많은 기본적으로 제로 이득 package.el주는 등 큰 패키지, 특히 노력 유지 보수의에 대한 Magit - 당신은 무료로 자동으로 적재 .


use-packagepackage.el과의 결합 은 실제로 매우 간단합니다. 전체 설정은이 조합을 기반으로합니다. 그러나 package.el을 실제로 사용하는 것이 훨씬 좋습니다. init 파일의 맨 처음에 package.el을 초기화하십시오.

(require 'package)
(setq package-enable-at-startup nil)   ; To prevent initialising twice
(add-to-list 'package-archives '("melpa" . "https://stable.melpa.org/packages/"))

(package-initialize)

편의상 부트 스트랩을 use-package아직 설치하지 않은 경우 부트 스트랩 할 수 있습니다 .

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

새로운 시스템에서 Emacs 세션을 시작하면 init.el이 자동으로 설치 use-package됩니다.

궁극적으로 다음을로드해야합니다 use-package.

(eval-when-compile
  (require 'use-package))

이제 use-package패키지를 설치하고 구성 하는 데 사용할 수 있습니다 .

(use-package magit                      ; The one and only Git frontend
  :ensure t
  :bind (("C-c v c" . magit-clone)
         ("C-c v v" . magit-status)
         ("C-c v g" . magit-blame)
         ("C-c v l" . magit-log-buffer-file)
         ("C-c v p" . magit-pull))
   :config (setq magit-save-repository-buffers 'dontask))

Emacs가 시작 use-package중에이 양식을 평가할 때 Magit이 이미 설치되어 있는지 확인하고 필요한 경우 자동으로 설치합니다.


3
"왜 그렇게하는지 모르겠습니다."내가 볼 수있는 유일한 이유는 시작 시간에 관한 package-initialize것입니다. 경로를 채우고 자동로드를 정의하고 나머지 작업을 수행하는 데 시간이 걸립니다. Jon Wiegley 자신 (저자 use-package)은 use-package의존하지 않고 스탠자 에서 모든 자동로드 명령을 선언하는 것을 선호한다고 생각합니다 package.el.
François Févotte

지난번에 그는 package.el을 전혀 사용하지 않았으며, 어쨌든 많이 얻을 것이라고 생각하지 않습니다. load-pathvia use-package또는 via 중 어느 경우 에나 를 채우고 자동로드를 추가 해야합니다 package.el. 특히 빠른 디스크가 장착 된 최신 시스템을 사용하는 경우 측정 가능한 차이가 있는지 의심됩니다.
lunaryorn

3
동의했다. 나는 타이밍을 스스로했다. 빠른 디스크를 사용하면 차이가 거의 없습니다. 느린 디스크를 사용하면의 package-initialize사용자 지정 목록보다 시작 속도가 눈에 띄게 느려질 수 있습니다 (0.2s와 같은 것) load-path. 나는 이것을 파일 시스템의 "탐사"에 기인한다 package.el. 그러나 autoload파일에서 정의를 로드 하고 use-package스탠자에 넣는 것 사이의 성능 차이는 전혀 측정하지 않았습니다 .
François Févotte

내가 한 음, 내가 언급하지 않았다 비활성화package.el 시스템을, 나는 단지 장애인 말할 것 package-initialize! 그 이유는 list-packages새 패키지를 찾고 특히 현재 설치된 모든 패키지를 업데이트하고 싶지만 타겟로드를 선호한다고 생각합니다 use-package. 명령에 대해서만 자동로드를 사용하는 경우 좋은 소리를 사용합니다!
Omar

1
@ OmarAntolín-Camarena 왜 안되죠? 자동로드는 기본적으로 사용자가 직면 한 패키지의 공용 인터페이스이며 package.el이 패키지 배포의 표준 방법이 되었기 때문에 패키지의 존재 여부에 의존 할 수 있습니다.
lunaryorn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.