MELPA를 통해 설치된 패키지를 다운 그레이드하는 가장 쉬운 방법


22

때때로, MELPA의 패키지 업데이트는 emacs의 일부를 손상시킬 수 있으며, 이런 일이 발생하면 이전 버전의 패키지를 사용하여 다시 되돌릴 수 있기를 원합니다.

지금은 두 가지 방법으로 할 수 있습니다.

  • 휴지통으로 이동하여 파일을 삭제하도록 emacs를 설정했으며 패키지를 업데이트하면 이전 버전이 휴지통으로 이동합니다. 이전 버전을 검색하고에서 버전을 바꿀 수 있습니다 ~/.emacs.d/elpa.

  • 기능을 깨뜨린 패키지의 github 저장소로 이동하여 이전 버전의 패키지를 가져오고 ~/.emacs.d/elpagitub 의 패키지로 바꾸고 파일을 바이트 다시 컴파일하십시오.

이 두 가지 방법에는 많은 수동 작업이 필요합니다. MELPA에서 설치된 패키지를보다 쉽게 ​​다운 그레이드하는 방법이 있습니까?


4
ELPA / package.el, Melpa 및 Melpa-stable을 통해서만 최신 버전을 설치할 수 있으며 이전 버전의 패키지도 보관하지 않습니다. 패키지를 수동으로 설치하려면 1) 소스 코드를 다운로드하십시오 2) M-x package-install-file. el-getquelpa 와 같이 ELPA / package.el 외에도 패키지를 관리하는 다른 방법이 있습니다 .ELPA 없이 사용할 수있는 것 같습니다. 아마도 원하는 것을 할 수 있습니다.
xuchunyang

2
이 질문에 대한 간단 하고 실행 가능한 답변을 얻지 못하면 개선 요청을 Emacs로 보내는 것을 고려하십시오 : M-x report-emacs-bug(향상 요청에도 해당).
Drew

답변:


9

M-x list-packages인터페이스를 통해 패키지를 업데이트하면 패키지를 성공적으로 설치 한 후 이전 패키지를 제거 할 것인지 묻는 메시지가 표시됩니다. 제자리에 그대로두면 나중에이 인터페이스를 통해 최신 패키지를 제거 할 수 있습니다.

현재 패키지 목록에는 ~ / .emacs.d / elpa / 디렉토리 트리에 설치된 4 가지 버전의 magit이 표시됩니다.

  magit              20160827.1549 obsolete              A Git porcelain inside Emacs
  magit              20160907.945  obsolete              A Git porcelain inside Emacs
  magit              20161001.1454 obsolete              A Git porcelain inside Emacs
  magit              20161123.617  installed             A Git porcelain inside Emacs

나중에 키 ~(package-menu-mark-obsolete-deletion) 키를 사용하여 이전 버전을 정리하여 사용되지 않는 모든 패키지를 표시 할 수 있습니다. 특정 이전 버전을 삭제하려면 해당 라인으로 이동 한 후을 눌러 d삭제 표시하십시오. 패키지를 표시 한 후 x평소와 같이 작업을 실행하는 데 사용 합니다.

에서 이맥스 (25) 마크에 대한 모든 패키지 Upgrade 기능은 자동으로 삭제 기존의 모든 패키지를 설정하고, 설치 한 후 확인을 묻는 메시지를 표시하지 않습니다. 대문자 "D"로 시작하는 줄을 찾아야합니다.이 마크는 표시를 해제 할 수 있습니다 (다음 매크로에서 가장 좋습니다).

다음 줄에서 대시 왼쪽에 키 또는 코드를 입력하십시오.

<F3>  - start macro recording
C-s   - isearch-forward
C-q   - quoted-insert
C-j   - linefeed character
D     - the mark at the start of the line
<Ret> - stops the isearch on the line with the "D"
u     - unmark the package for deletion
<F4>  - stops macro recording - the first package is now unmarked
<F4>  - executes the macro for the next upgraded package

검색에 더 이상 일치하는 항목이 없으면 매크로가 벨을 울리고 중지되므로 C-u 0 <F4>삭제 표시된 모든 패키지의 표시를 해제 할 수 있습니다. 그런 다음 x설치를 중단 할 수 있습니다 .

내 의견에서 변경되었다고 선언 한 함수는 끝까지 반복하지 않기 위해 마지막 (cond) 블록이 성공해야한다는 점에서 아직 파악할 수없는 방식으로 변경해야합니다.


오, 내 emacs에서 삭제 확인을 요청하지 않습니다. 그것은 단지 오래된 패키지를 삭제합니다 : / 나는 그것이 emacs 24에서 묻는 데 사용 된 것 같아? 기억이 안나요
Chakravarthy Raghunandan

과연. Emacs 24 프롬프트, 25는 오래된 것을 삭제 표시하고 표시를 실행하면 트리거됩니다. 당신은 손으로 설치를위한 패키지를 표시하거나 삭제를 해제하거나 변경할 수 (t (package-menu-mark-delete))에 줄을 package-menu--mark-upgrades-1첫 번째 줄은 구성 변수 또는 반환하는 것이 무엇인가에 대한 테스트가되도록 nil즉시 기존 패키지를 삭제하지 않으
p_wiersig

package.el원래 답변에서 편집 할 관련 줄을 추가하여 답변을 수락 할 수 있습니까? 감사합니다
Chakravarthy Raghunandan

확실한. 원하는 기능을 수행하기 위해 함수를 만들 수 없다는 것을 알았으므로 매크로를 통해 모두 표시를 해제하는 방법을 설명했습니다.
p_wiersig

7

"핵 옵션"은 그대로 버리고 package.el대신 내가 작성한 패키지 관리자를 사용하는 straight.el것이다. 장점은 straight.elGit 리포지토리를 복제하여 패키지 를 설치하여 원하는 버전을 사용하는 것이 쉽지 않다는 것입니다. 또한 straight.el개정 잠금 파일을 처리하기위한 기능을 제공하여 패키지 관리 구성의 정확한 상태를 가장 세밀하게 기록 할 수 있습니다. 그런 다음 응급 상황의 경우 모든 패키지를 알려진 정상 버전으로 되돌릴 수 있습니다.

이러한 종류의 작업은 일반적으로 불가능 package.el하며 전체 디자인으로 인해 항상 불가능합니다.

패키지를 업데이트 할 때마다 커밋을하지 않으려는 경우에는이 기능이 필요하지 않습니다 straight.el. 나는 것이 좋습니다 그 어느 이맥스 구성이 업그레이드 후 파손 된 상태로 도착하는 것이 불가능하게하고 되돌릴 방법을 알고하지 않기 때문에, 버전 잠금 파일을 작성하고 때마다 당신이 당신의 패키지를 업데이트하는 것이 커밋. 그러나 가장자리에 사는 삶을 좋아한다면이 작업을 수행 할 필요가 없습니다.


4

다운 그레이드하는 쉬운 방법을 찾았습니다. 자신 만의 melpa 아카이브 관리.

  1. 복제 멜파 레포.
  2. 모든 레시피를 제거하려면 melpa의 사용자 정의 melpa 아카이브 위키 페이지 를 따르십시오 .
  3. 다운 그레이드하려는 패키지의 커밋을 찾아 패키지에 대한 해당 커밋으로 새로운 레시피를 작성하십시오. ( 커밋을 지정하는 방법에 대한 melpa의 readme 참조 )
  4. make다운 그레이드 된 패키지를 빌드하기 위해 실행
  5. 로컬 디렉토리 일 수있는 고유 한 melpa 아카이브를 package-archives목록에 추가하십시오.
  6. 패키지 메뉴를 사용하여 다운 그레이드 된 패키지를 설치하십시오. 또는 package-pinned-packages패키지를 다운로드 할 아카이브를 제한하는 데 사용할 수 있습니다 .

3

많은 사람들이 ELPA 패키지를 버전 제어에 적용하지 않기로 선택했지만 이것이 내가 그렇게해야한다고 믿는 이유의 예입니다.

모든 것이 최선을 다하면 되돌릴 있습니다.

업스트림 ELPA 패키지의 상태에 따라 위험이 있습니다.


그러나 이는 패키지를 업데이트 할 때마다 커밋해야한다는 것을 의미합니다. 그것은 내가 원하는 것이 아닙니다. 또는 패키지 업데이트를 수행 할 때마다 emacs가 자동으로 스테이징되고 업데이트 된 패키지를 커밋 할 수있는 방법이 있습니까?
Chakravarthy Raghunandan

1
구성 변경을 의도적으로 결정하지 않으려는 이유를 이해하지 못합니다. 자동 커밋에 관해서는 자동화 할 수 있다고 확신 하지만 그에 대한 해결책은 없습니다. 그러나 이러한 솔루션을 검색하면 생산성이 높아질 수 있습니다.
phils
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.