설치된 패키지의 하위 집합 만로드하는 방법


13

여러 패키지 간의 상호 작용과 관련된 버그가 발생했습니다. 버그를보고하려면 문제를 설명하는 재현 가능한 레시피를 제공해야합니다. 이를 위해서는 적절한 패키지를로드해야하지만 init에서 다른 패키지는로드하지 않으며 다른 패키지는 없습니다. 가장 좋은 방법은 무엇입니까?

최신 정보

명확히하기 위해 문제를 일으키는 코드를 식별하기 위해 이진 검색에서 .emacs를 선별하는 개념에 익숙합니다. 이 상황에서 이미 어떤 패키지가 문제를 일으키는 지 정확히 알고 있습니다. 내가 모르는 것은 package-시스템을 사용하여 몇 개의 패키지 만로드 하는 방법 입니다.

(package-initialize)패키지뿐만 아니라 내 .emacs.d/elpa디렉토리의 다른 모든 것을로드합니다 . package-load-list로드 할 특정 버전의 패키지 또는 명시 적으로 제외 할 특정 패키지를 지정할 수 있습니다 . elpa / package 시스템에 다른 패키지를로드하지 않고 포함 할 패키지 목록을 Emacs에 제공하는 방법의 반대가 필요합니다 .


한정된 수의 패키지로 문제를 분리 한 경우 빈 .emacs파일 에서 시작하여 문제를 재현 해 볼 수 있습니다. 각 패키지를 하나씩 설치 한 다음 문제가 여전히 존재하는지 확인하십시오. 당신은 자신을 놀라게하고 다른 패키지와 잘 어울리지 않는 책임있는 패키지를 찾을 수 있습니다. Emacs -Q 에서 시작 하여 패키지 A를 설치 한 다음 패키지 B를 설치하고 패키지 C를 설치 하는 등 문제를 재현하고 버그 보고서를 제출하는 단계를 작성하십시오 . *Scratch*버퍼 를 열고 다음을 입력하십시오.
lawlist

@lawlist가 말한 것. 완전히 좁혀진 것이 확실하지 않으면 이진 검색을 사용하십시오. 문제를 재현하는 것의 임의의 1/2을 제거하십시오 (예 : 4 개 중 2 개의 pkg 제거). 그런 다음 3/4, 7/8, ...을 제거 할 때마다 코드를 반씩 자르는 데 필요한 코드를 제거하십시오. 주어진 pkg의 코드를 1/2 등으로 비슷하게 자르고, 그것을 재현하는 데 필요한 아주 작은 코드로 좁힐 수 있습니다. 명령 comment-region을 사용 C-u하여 텍스트 영역을 주석 처리 (또는 주석 해제) 할 수 있습니다.
Drew

나는 의사 코드 수준에서 이것을 이해합니다. package-family 명령을 사용하여 패키지의 하위 세트 만로드하는 방법을 이해하지 못합니다. emacs.d / elpa 디렉토리
Tyler

이전 테이너 내가 패키지 초기화로드하는 모든 것을 표시하고, 나는 확실히이 방지하는 방법을 모르겠어요 github.com/emacs-ess/ESS/issues/140
타일러

1
package-load-list 패키지를 명시 적으로 포함하는 방법 이므로all 심볼을 제거하면 됩니다.
npostavs

답변:


10

package-load-list변수는 패키지와 버전을로드 할 정확하게 지정하는 데 사용할 수 있습니다 :

List of packages for `package-initialize' to load.
Each element in this list should be a list (NAME VERSION), or the
symbol `all'.  The symbol `all' says to load the latest installed
versions of all packages not specified by other elements.

For an element (NAME VERSION), NAME is a package name (a symbol).
VERSION should be t, a string, or nil.
If VERSION is t, the most recent version is activated.
If VERSION is a string, only that version is ever loaded.
 Any other version, even if newer, is silently ignored.
 Hence, the package is "held" at that version.
If VERSION is nil, the package is not loaded (it is "disabled").

조심하는 유일한 것은 기본 값이 포함되어 있다는 것입니다 all당신이 경우, setq그 완전히 원래의 값을 덮어 쓰기 때문에 그 다음 당신은 괜찮을거야.

(require 'package)
(setq package-load-list
      '((package1 "4.2")
        (package2 "0.5.1")))
(package-initialize)

4

버그를 재현하기 위해 작업하는 개발자가 해당 종속성을 아직 설치하지 않았거나 원하지 않을 수있는 상황에서 제대로 작동하는 옵션은 try패키지 ( https://melpa.org/#/try ) 를 사용하는 것 입니다. 다른 사람들은 로컬 설치를 수정하지 않고 패키지 관리에서 패키지를로드 할 수 있습니다.

(package-install 'try)
(require 'try)

(try 'some-package)
(try 'some-other-package)

(steps (to reproduce) (the (problem)))

2

이 사용 사례는의 끔찍한 결함 package.el이므로 사용하지 마십시오 package.el. 대신 straight.el이 사용 사례를 지원하도록 특별히 설계된 (저는 저자입니다) 와 같은 패키지 관리자를 사용하십시오.

straight.el다른 패키지 관리자와의 비교를 포함한 자세한 내용은 README를 참조하십시오 . 아래에서는 귀하의 질문과 관련된 섹션을 인용했습니다.

straight.el버그 재현에 사용

내가 쓰고 싶었던 주요 이유 중 하나는 straight.el기존 패키지 관리자가 버그를 재현하는 데 좋지 않았기 때문입니다. 예를 들어, 패키지 관리자가 초기화 될 때 일부는 설치된 모든 패키지를로드합니다! "최소 테스트 사례"에는 해당되지 않습니다.

반대로 부트 스트랩 straight.elstraight.el자체를 제외하고는 아무것도로드하지 않습니다 (기본 레시피 저장소는 등록되지만 필요할 때까지 복제되지 않습니다). 일반적으로 부트 스트랩 스 니펫straight.el 을 사용하여 로드해야 하지만에있을 때 초기화하는 방법은 다음과 같습니다.emacs -Qstraight.el

M-x load-file RET ~/.emacs.d/straight/bootstrap.el RET

명령 행에서 별명을 작성하여이를 수행 할 수도 있습니다.

$ emacs -Q -l ~/.emacs.d/straight/bootstrap.el

Projectile에 대한 버그 보고서를 작성한다고 가정 해 보겠습니다. Projectile과 모든 종속 항목 만로드하려면 다음을 실행하십시오.

M-x straight-use-package RET projectile RET

여기에는 현재 체크 아웃 된 Projectile 및 모든 종속 항목이 사용되므로 버그 보고서를 작성하려면 해당 사항을 기록해야합니다.


0

일회성으로 필요할 때 (예 : 버그를 재현하기 위해 레시피를 시도하고 테스트하기 위해) 다음과 같이 자주 벗어날 수 있습니다.

emacs -Q -l ~/.emacs.d/elpa/<pkg>-<vers>/<pkg>-autoloads.el

나는 의존성에주의를 기울이지 않기 때문에 "종종"이라고 말했다. 어떤 경우 -l ...에는 필요한 다른 패키지를로드 하기 위해 더 많은 인수를 추가해야한다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.